function Favorites()
{
}

Favorites.url = "xml/data/?return=favorites";
Favorites.url_add = "xml/data/?return=favorites&add={0}";
Favorites.url_remove = "xml/data/?return=favorites&remove={0}";

Favorites.href = "accommodation/{0}";

Favorites.setup = function ()
{
	Favorites.loaded = false;
	Favorites.setupControls();
	Favorites.setupLinks();
}

Favorites.cleanup = function ()
{
	Favorites.link = null;
	Favorites.browse = null;
	Favorites.empty = null;
	Favorites.loading = null;
	Favorites.content = null;
	Favorites.control = null;
}

Favorites.setupControls = function ()
{
	Favorites.link = document.getElementById("ctrl_fav_toggle");
	Favorites.control = document.getElementById("ctrl_favorites");

	Favorites.empty = dom.getElementsByClassName(Favorites.control, "empty", "div")[0];
	Favorites.browse = dom.getElementsByClassName(Favorites.control, "browse", "div")[0];
	Favorites.loading = dom.getElementsByClassName(Favorites.control, "loading", "div")[0];
	Favorites.content = dom.getElementsByClassName(Favorites.control, "content", "div")[0];

	evt.addHandler(Favorites.link, "onclick", Favorites.toggle_onclick);
	evt.addHandler(document, "onmouseup", Favorites.document_mouseup);
}

Favorites.setupLinks = function ()
{
	var links = dom.getElementsByClassName(document, "favorite", "a");
	for (var i = 0; i < links.length; i++)
		evt.addHandler(links[i], "onclick", Favorites.addremove_onclick);

	var imgs = dom.getElementsByClassName(document, "favorite", "img");
	for (var i = 0; i < imgs.length; i++)
		evt.addHandler(imgs[i], "onclick", Favorites.addremove_onclick);
}

Favorites.toggle = function ()
{
	if (Favorites.control.offsetHeight)
		Favorites.hide();
	else
		Favorites.show();
}

Favorites.show = function ()
{
	if (this.loaded != true)
		this.load();

	css.addClassName(this.link, "active");
	css.display(this.control);
}

Favorites.hide = function ()
{
	css.removeClassName(this.link, "active");
	css.undisplay(this.control);
}

Favorites.autohide = function (srcElement)
{
	if (srcElement != this.link && !dom.elementContains(this.control, srcElement))
		this.hide();
}

Favorites.load = function ()
{
	css.undisplay(Favorites.content);
	css.display(Favorites.loading);

	var request = xml.createHttpRequest(null, true, createCallback(this, "draw"));
	request.open("GET", Favorites.url, true);
	request.send(null);
}

Favorites.draw = function (request)
{
	if (request.responseXML != null)
	{
		var doc = request.responseXML.documentElement;
		var nodes = doc.getElementsByTagName("property");

		this.content.innerHTML = "";

		var ids = new Array;
		for (var i = 0; i < nodes.length; i++)
		{
			var pid = nodes[i].getAttribute("ID");
			var item = this.content.appendChild(document.createElement("div"));
			item.className = "item";

			var icon = item.appendChild(document.createElement("a"));
			icon.className = "favorite remove f{0}".format(pid);
			icon.title = "Remove from favorites";
			icon.href = "javascript:;";

			var link = item.appendChild(document.createElement("a"));
			link.className = "link";
			link.href = Favorites.href.format(nodes[i].getAttribute("NameID"));
			link.innerHTML = nodes[i].getAttribute("Name");
			link.title = nodes[i].getAttribute("Summary");

			evt.addHandler(link, "onclick", Favorites.toggle);
			evt.addHandler(icon, "onclick", Favorites.addremove_onclick);

			ids.push(pid);
		}

		css.undisplay(this.loading);
		if (nodes.length == 0)
		{
			css.undisplay(this.content);
			css.display(this.empty);
			css.undisplay(this.browse);
		}
		else
		{
			css.display(this.content);
			css.undisplay(this.empty);
			css.display(this.browse);
		}

		Favorites.loaded = true;

		return ids;
	}
	else
		return null;
}

Favorites.update = function (request)
{
	var ids = this.draw(request);
	var favs = dom.getElementsByClassName(document, "favorite", "a");
	for (var i = 0; i < favs.length; i++)
	{
		if (dom.elementContains(this.control, favs[i]))
			continue;

		if (favs[i].className.match(/\bf(\d+)\b/))
		{
			var pid = RegExp.$1;
			if (ids.contains(pid))
				this.setFavoriteState(favs[i], 1);
			else
				this.setFavoriteState(favs[i], 0);
		}
	}
	if (favs.length == 0)
	{
		var member_favorites = document.getElementById("member_favorites");
		if (member_favorites != null)
		{
			var empty = dom.getElementsByClassName(member_favorites, "empty")[0];
			if (empty != null)
				css.display(empty);
		}
	}
	HoverTitle.initializeElements();
}

Favorites.add = function (pid)
{
	var request = xml.createHttpRequest(null, true, createCallback(this, "update"));
	request.open("GET", Favorites.url_add.format(pid), true);
	request.send(null);
}

Favorites.remove = function (pid)
{
	var request = xml.createHttpRequest(null, true, createCallback(this, "update"));
	request.open("GET", Favorites.url_remove.format(pid), true);
	request.send(null);
}

Favorites.setFavoriteState = function (fav, state)
{
	if (state == 1)
	{
		css.addClassName(fav, "remove");
		css.removeClassName(fav, "add");
		fav.title = "Remove from favorites";

		if (fav.innerHTML.trim() != "")
			fav.innerHTML = "Remove favorite";
	}
	else
	{
		css.addClassName(fav, "add");
		css.removeClassName(fav, "remove");
		fav.title = "Add to favorites";

		if (fav.innerHTML.trim() != "")
			fav.innerHTML = "Add favorite";
	}
}

Favorites.toggle_onclick = function (e)
{
	try
	{
		Favorites.toggle();
	}
	catch(e)
	{
		log.error(e.message);
	}
	return false;
}

Favorites.addremove_onclick = function ()
{
	if (this.className.match(/\b(add|remove)\b/))
		var action = RegExp.$1;
	if (this.className.match(/\bf(\d+)\b/))
		var pid = RegExp.$1;

	if (action != undefined && pid != undefined)
	{
		if (action == "add")
			Favorites.add(pid);
		else
		{
			if (confirm("Are you sure you want to remove this favorite?"))
			{
				Favorites.remove(pid);
				var favNode = document.getElementById("fav" + pid);
				if (favNode != null)
					favNode.parentNode.removeChild(favNode);
			}
		}
	}
}

Favorites.document_mouseup = function (e)
{
	Favorites.autohide(evt.srcElement(e));
}

evt.addHandler(window, "onready", Favorites.setup);
evt.addHandler(window, "onunload", Favorites.cleanup);
