var initdone = false;
var engineroot;

function NSResolver(prefix) {
	if(prefix == 'html') {
		return 'http://www.w3.org/1999/xhtml';
	}
	return null;
}

function focus(id) {
	setTimeout(function () { window.location.hash = "#"+id; }, 0);
}

function showError(where, text) {
	var div = document.createElement("div");
	var brite = document.createElement("strong");
	brite.appendChild(document.createTextNode(text));
	div.appendChild(brite);
	where.appendChild(div);
}

function unescapeSitemap(where) {
	var urls = document.evaluate('//html:a[@class="url"]', where, NSResolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	var urlnode, i;
	for(i=0 ; i<urls.snapshotLength ; i++) {
		urlnode = urls.snapshotItem(i);
		var content = urlnode.firstChild;
		urlnode.replaceChild(document.createTextNode(decodeURIComponent(content.nodeValue)), content);
	}
}

function reformatDates(where) {
	var dates = document.evaluate('//html:span[@class="date"]', where, NSResolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
	var datenode, i;
	for(i=0 ; i<dates.snapshotLength ; i++) {
		datenode = dates.snapshotItem(i);
		var content = datenode.firstChild;
		var utcdate = new Date(content.nodeValue);
		datenode.replaceChild(document.createTextNode(utcdate.toString()), content);
	}
}

function displayArticle(a) {
	var div = a.parentNode.parentNode.parentNode;
	var img = document.createElement("img");
	img.setAttribute("src", engineroot+"images/ajax-loader.gif");
	var loader = document.createElement("div");
	loader.appendChild(img);
	div.appendChild(loader);
	var request = new XMLHttpRequest();
	request.open('GET', a.getAttribute("href")+'?xsl=content', true);
	request.setRequestHeader('Accept', 'application/xhtml+xml');
	request.onreadystatechange = function() {
		if(request.readyState == 4) {
			div.removeChild(loader);
			if(request.status == 200) {
				if(request.responseXML && request.responseXML.documentElement) {
					reformatDates(div.appendChild(document.importNode(request.responseXML.documentElement, true)));
				} else {
					showError(div, "Error while loading entry");
				}
			} else {
				showError(div, "Error while loading entry: "+request.statusText);
			}
			var actions = document.evaluate('html:ul[@class="actions"]', div, NSResolver, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
			var a = actions.firstChild.firstChild;
			a.setAttribute("href", "#");
			a.firstChild.data = "hide";
			a.addEventListener("click", hidearticle, false);
		}
	}
	request.send(null);
}

function displayComments(a, unhideForm, dofocus) {
	var div = a.parentNode;
	div.removeChild(a);
	var loader = document.createElement("img");
	loader.setAttribute("src", engineroot+"images/ajax-loader.gif");
	div.appendChild(loader);
	var request = new XMLHttpRequest();
	request.open('GET', a.getAttribute("href")+'?xsl=content', true);
	request.setRequestHeader('Accept', 'application/xhtml+xml');
	request.onreadystatechange = function() {
		if(request.readyState == 4) {
			div.removeChild(loader);
			if(request.status == 200) {
				if(request.responseXML && request.responseXML.documentElement) {
					reformatDates(div.appendChild(document.importNode(request.responseXML.documentElement, true)));
					var a = document.getElementById("_addcommentlink");
					if(unhideForm) {
						displayAddComment(a);
					} else {
						a.addEventListener("click", showaddcommentform, false);
						if(dofocus) {
							focus(dofocus);
						}
					}
				} else {
					showError(div, "Error while loading comments");
				}
			} else {
				showError(div, "Error while loading comments: "+request.statusText);
			}
		}
	}
	request.send(null);
}
function displayAddComment(a) {
	a.parentNode.removeChild(a);
	document.getElementById("_addcomment").style.display = "block";
	focus("_addcomment");
}

function hidearticle(evt) {
	this.removeEventListener("click", hidearticle, false);
	var div = this.parentNode.parentNode.parentNode;
	var article = document.evaluate('html:div', div, NSResolver, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
	div.removeChild(article);
	this.firstChild.data = "show";
	this.setAttribute("href", document.evaluate('html:span[@class="blogentry"]/html:a/@href', div, NSResolver, XPathResult.STRING_TYPE, null).stringValue);
	this.addEventListener("click", showarticle, false);
	evt.preventDefault();
}

function showarticle(evt) {
	this.removeEventListener("click", showarticle, false);
	displayArticle(this);
	evt.preventDefault();
}

function showall(evt, blogentries) {
	for(i=0 ; i<blogentries.snapshotLength ; i++) {
		var item = document.evaluate('../../html:ul[@class="actions"]/html:li/html:a[.="show"]', blogentries.snapshotItem(i), NSResolver, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
		if(item) {
			item.removeEventListener("click", showarticle, false);
			displayArticle(item);
		}
	}
}

function showcomments(evt) {
	this.removeEventListener("click", showcomments, false);
	displayComments(this, false, "_comments");
	evt.preventDefault();
}

function showaddcommentform(evt) {
	displayAddComment(this);
	evt.preventDefault();
}

function init() {
	if(!initdone) {
		initdone = true;

		engineroot = document.evaluate('//html:link[@rel="start"]/@href', document, NSResolver, XPathResult.STRING_TYPE, null).stringValue;

		var info = document.getElementById("_info");
		if(info) {
			var request1 = new XMLHttpRequest();
			request1.open('GET', engineroot+'plugins/loginstatus', true);
			request1.onreadystatechange = function() {
				if(request1.readyState == 4 && request1.status == 200) {
					if(request1.responseText) {
						var a1 = document.createElement("a");
						a1.setAttribute("href", engineroot+"~?mode=logout");
						a1.appendChild(document.createTextNode("Log out"));
						var a2 = document.createElement("a");
						a2.setAttribute("href", engineroot+"~"+request1.responseText+"/");
						a2.appendChild(document.createTextNode(request1.responseText));
						info.appendChild(document.createTextNode("Logged in as "));
						info.appendChild(a2)
							info.appendChild(document.createTextNode(". "));
						info.appendChild(a1);
						info.appendChild(document.createTextNode("."));
					} else {
						var a1 = document.createElement("a");
						a1.setAttribute("href", engineroot+"~?mode=login");
						a1.appendChild(document.createTextNode("Log in"));
						var a2 = document.createElement("a");
						a2.setAttribute("href", engineroot+"~?mode=register");
						a2.appendChild(document.createTextNode("register"));
						info.appendChild(a1);
						info.appendChild(document.createTextNode(" or "));
						info.appendChild(a2);
						info.appendChild(document.createTextNode("."));
					}
				}
			}
			request1.send(null);
		}
		reformatDates(document);
		unescapeSitemap(document);

		var blogentries = document.evaluate('//html:span[@class="blogentry"]/html:a', document, NSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		for(i=0 ; i<blogentries.snapshotLength ; i++) {
			var item = blogentries.snapshotItem(i);
			var actions = document.evaluate('../../html:ul[@class="actions"]', item, NSResolver, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
			var action1 = document.createElement("li");
			var a1 = document.createElement("a");
			a1.setAttribute("href", item.getAttribute("href"));
			a1.appendChild(document.createTextNode("show"));
			var action2 = document.createElement("li");
			var a2 = document.createElement("a");
			a2.setAttribute("href", item.getAttribute("href")+"#_comments");
			a2.appendChild(document.createTextNode("comments"));
			action1.appendChild(a1);
			action2.appendChild(a2);
			actions.insertBefore(action2, actions.firstChild);
			actions.insertBefore(action1, actions.firstChild);
			if(i == 0) {
				displayArticle(a1);
			} else {
				a1.addEventListener("click", showarticle, false);
			}
		}

		var blog = document.getElementById("_blogtitle");
		if(blog) {
			blog.addEventListener("click", function(evt) { showall(evt, blogentries); }, false);
			blog.className = "blogtitle";
		}

		var article = document.getElementById("_articletitle");
		if(article) {
			var link = document.evaluate('//html:ul[@class="menu"]/html:li/html:a[.="comments"]/@href', document, NSResolver, XPathResult.STRING_TYPE, null).stringValue;
			if(link) {
				var request2 = new XMLHttpRequest();
				request2.open('GET', link+'?xsl=count', true);
				request2.onreadystatechange = function() {
					if(request2.readyState == 4 && request2.status == 200) {
						if(request2.responseText) {
							var a = document.createElement("a");
							a.setAttribute("href", link);
							a.appendChild(document.createTextNode("Show all comments ("+request2.responseText+")"));
							article.parentNode.appendChild(a);
							if(window.location.hash == "#_addcomment") {
								displayComments(a, true);
							} else if(window.location.hash == "#_comments" || window.location.hash.search(/_\d+/) != -1) {
								displayComments(a, request2.responseText == '0', window.location.hash.substr(1));
							} else if(request2.responseText == '0') {
								displayComments(a);
							} else {
								a.addEventListener("click", showcomments, false);
							}
						}
					}
				}
				request2.send(null);
			}
		}
	}
}

document.addEventListener("load", init, false);
document.addEventListener("DOMContentLoaded", init, false);


