var xmlHttp;
var then;
var hash;
var dots;
var url;

function GetXmlHttpObject() {
	var tmp = null;
	
	try{
		// Firefox, Opera 8.0+, Safari
		tmp = new XMLHttpRequest();
	}catch (e) {
		// Internet Explorer
		try {
			tmp = new ActiveXObject("Msxml2.XMLHTTP");
		}catch (e){
			tmp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}

	return tmp;
}

function insertParam(url, param) {
    var hash = "";
    var query = [];
    var data = url.split("#");

    url = data[0];

    if(data.length > 1) {
       hash = data[1];
       this.hash = hash;
    }

    data = url.split("?");
    url = data[0];

    if(data.length > 1) {
       query = data[1];
       query = query.split("&");
    }

    query.push(param);

    url = url + "?" + query.join("&") + (hash.length > 0 ? ("#" + hash) : "");

    return url;
}

function updateMenu() {
	var http = GetXmlHttpObject();	
	if(http == null) return;

	http.onreadystatechange = function() {
		if(http.readyState == 4) {
			var data = http.responseText.split("\n");

			if(data.length == 5) {
				// Messages
				if (parseInt(data[0]) > 0) {
					document.getElementById("mail_image").src = 'style/newmail.png';
				} else {
					document.getElementById("mail_image").src = 'style/mail.png';
				}
				
				document.getElementById("mail_image").title = data[0] + ((parseInt(data[0]) == 1) ? ' nytt meddelande' : ' nya meddelanden');
		
				// Friends
				if (parseInt(data[1]) > 0) {
					document.getElementById("friends_image").src = 'style/newfriends.png';
				} else {
					document.getElementById("friends_image").src = 'style/friends.png';
				}

				document.getElementById("friends_image").title = data[1] + ' obesvarade vänförfrågningar';
				
				// Watched topics
				var message = '';
				if (parseInt(data[2]) > 0) {
					document.getElementById("watched_image").src = 'images/eye_open.png';
				} else {
					document.getElementById("watched_image").src = 'images/eye_closed.png';
				}
				
				document.getElementById("watched_image").title = data[2] + ' nya bevakade inlägg!';
				
				// Number of users online
				if(data[3] > 0) {
					document.getElementById("numUsersOnline").innerHTML = data[3];
				}
				
				// Snowballs
				if(data[4] > 0) {
					var snowballHtml = GetXmlHttpObject();

					if(snowballHtml != null) {
						snowballHtml.onreadystatechange = function() {
							if (snowballHtml.readyState == 4) {
								var ids = snowballHtml.responseText.split('\n');

								for(var i = 0; i < ids.length; i++) {
									var snowballURL = "javascript/snowball.php?id=" + ids[i];
									window.open(snowballURL, "snowballWindow" + ids[i], "toolbar=0,location=0,status=0,scrollbars=1,width=350,height=350");
								}
							}
						};
					
						snowballHtml.open("GET", "javascript/snowballs.php?time=" + (new Date().getTime()), true);
						snowballHtml.send(null);
					}
				}
			}
		}
	};

	http.open("GET", "javascript/check_menu.php", true);
	http.send(null);
}

function updateDiv(div, url) {
	if (xmlHttp.readyState == 4) {
		if (xmlHttp.responseText != "0\n" || div != "content") {
			var content = xmlHttp.responseText.split("\n");

			if(div == "content") {
				document.title = content[0];
				content.shift();
			}

			document.getElementById(div).innerHTML = content.join("\n");
			document.getElementById("refreshImage").src = "images/refresh.png";
			document.body.style.cursor = 'default';
			
			if(div == "content" && url.indexOf("#") != -1) {
				// Scroll to the hash tag, if there was one
				var objectID = url.substring(url.lastIndexOf("#") + 1);
				var obj = document.getElementById(objectID);
				var y = findPosY(obj);
				window.scroll(0, y);
			}

			var date = new Date();
			var now = date.getTime();

			var time = Math.round(now - then) / 1000;

			document.getElementById("time").innerHTML = time;
			document.getElementById("loadTime").value = Math.floor(now / 1000);
		}else{
			window.location = document.getElementById("refreshLink").href;
		}
	}
}

function loadDiv(div, url, reset) {
	var date = new Date();
	this.then = date.getTime();
	document.getElementById("refreshImage").src = "images/rotate.gif";
	document.body.style.cursor = 'wait';

	if(reset) {
		document.getElementById(div).innerHTML = "Laddar...";
	}

	xmlHttp = GetXmlHttpObject();
	if (xmlHttp === null) {
		return;
	}

	if(div == "content") {
		document.getElementById("refreshLink").href = url;
		window.location.hash = url;	
		this.url = url;
	}

	url = insertParam(url, "ajax=1");

	xmlHttp.onreadystatechange = function() { updateDiv(div, url); };
	xmlHttp.open("GET", url, true);
	xmlHttp.send(null);

	return false;
}

function loadStuff(url, reset) {
	var result = loadDiv("content", url, reset);
	
	if(!result) {

	}
	
	return result;
}

function follow(link) {
	var url = link.href.substr(link.href.lastIndexOf('/') + 1);
	url = ".#" + encodeURI(url);
	window.location = url;
	this.url = "";
	return false;
}

function runOnLoad(fnc) {
	if(document.getElementById("loadingComplete") == null) {
		setTimeout(function() { runOnLoad(fnc); }, 100);
	}else{
		fnc();
	}
}

function loadContent(url) {
	var tmp = loadStuff(url.substr(url.lastIndexOf('/') + 1), true);

	// Do some JavaScript starts
	if(url == "hang.php") {
		runOnLoad(function() {
			resetHangman();
			document.getElementById("guess").focus();
			startTimer();
		});
	}

	return tmp;
}

function refreshContent() {
	loadStuff(this.url, false);
}

function sendForm(form) {
	var date = new Date();
	var i;

	this.then = date.getTime();

	// Handle input tags
	var inputs = form.getElementsByTagName('input');
	params = [];
	for(i = 0; i < inputs.length; i++) {
		if(inputs[i].name) {
			if((inputs[i].type !== "checkbox" || inputs[i].checked) && // Checkboxes and radio buttons should only be included if they are checked.
			   (inputs[i].type !== "radio" || inputs[i].checked)) {
				params.push(inputs[i].name + '=' + encodeURIComponent(inputs[i].value));
			}
		}
	}

	var selects = form.getElementsByTagName('select');
	for(i = 0; i < selects.length; i++) {
		if(selects[i].name) {
			params.push(selects[i].name + '=' + encodeURIComponent(selects[i].options[selects[i].selectedIndex].value));
		}
	}

	var textAreas = form.getElementsByTagName('textarea');
	for(i = 0; i < textAreas.length; i++) {
		if(textAreas[i].name) {
			params.push(textAreas[i].name + '=' + encodeURIComponent(textAreas[i].value));
		}
	}
	
	if(form.method == "post") {
		params.push("ajax=1");
	}

	params = params.join('&');
	
	var url = form.action.substr(form.action.lastIndexOf('/') + 1);
	
	if(form.method == "get") {
		url += "?" + params;
		window.location = "#" + url;
		this.url = "";
		return false;
	}

	var ajax = GetXmlHttpObject();
	if(ajax === null) {
		return true;
	}
	
	document.getElementById("content").innerHTML = "Laddar...";

	document.getElementById("refreshLink").href = url;
	window.location.hash = url;
	this.url = url;

	url = insertParam(url, "ajax=1");

	// Send the proper header information along with the request
	ajax.open("POST", url, true);
	
	ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
	ajax.setRequestHeader("Content-Length", params.length);
	ajax.setRequestHeader("Connection", "close");

	ajax.onreadystatechange = function() {
		if(ajax.readyState == 4) {
			if (ajax.responseText != "0\n") {
				var content = ajax.responseText.split("\n");
				
				// Did we come across a redirect?
				if(content[0][0] == "#") {
					window.location = content[0].substring(1);
				}else{
					// No, proceed as usual
					document.title = content[0];
					content.shift();

					document.getElementById("content").innerHTML = content.join("\n");
					document.getElementById("refreshImage").src = "images/refresh.png";
					document.body.style.cursor = 'default';

					var date = new Date();
					var now = date.getTime();

					var time = Math.round(now - then) / 1000;

					document.getElementById("time").innerHTML = time;
					document.getElementById("loadTime").value = Math.floor(now / 1000);
				}
			}else{
				window.location = document.getElementById("refreshLink").href;
			}
		}
	};
	
	ajax.send(params);

	return false;
}

// Upload the duel continuously
function reloadDuel() {
	var duel = document.getElementById("duel").value;
	var lastSpell = document.getElementById("last_spell").value;

	var ajax = GetXmlHttpObject();

	if(ajax === null) {
		return;
	}

	var url = "javascript/duel_update.php";
	url = url + "?duel=" + duel + "&last_spell=" + lastSpell;

	ajax.onreadystatechange = function() {
		if(ajax.readyState == 4) {
			var newSpells = parseInt(ajax.responseText, 10);
			if(newSpells > 0) {
				loadStuff("duel.php?id=" + duel, false);
			}
		}
	};

	ajax.open("GET", url, true);
	ajax.send(null);
}

// Reload main forum page
var lastForumLoad = 0;
function updateForums(loadTime) {
	var loadTime = document.getElementById("loadTime").value;

	request = GetXmlHttpObject();

	if(request == null || loadTime == null) {
		return;
	}
	
	var time = Math.max(parseInt(loadTime), lastForumLoad);

	var url = "javascript/new_posts.php?time=" + time + "&" + (new Date().getTime());

	request.onreadystatechange = function() { 			
		if (request.readyState == 4 && request.status == 200) {
			var forums = request.responseXML.getElementsByTagName("forums")[0];
			for(var i = 0; i < forums.childNodes.length; i++) {
				var forum = forums.childNodes[i];
				var date = parseInt(forum.getElementsByTagName("postDate")[0].text);
				lastForumLoad = Math.max(date, lastForumLoad);

				date = new Date(1000 * date);
				var hour = date.getHours();
				var minute = date.getMinutes();

				var url = "forum.php?topic=" + forum.getElementsByTagName("topicID")[0].text + "&amp;page=" + forum.getElementsByTagName("topicPages")[0].text + "#p" + forum.getElementsByTagName("postID")[0].text;
				var latestString = "";
				latestString += "<a href=\"" + url + "\" onclick=\"return loadContent('" + url + "');\">" + forum.getElementsByTagName("topicName")[0].text + "</a>";
				latestString += "<br />";
				latestString += ((hour < 10) ? "0" + hour : hour) + ":" + ((minute < 10) ? "0" + minute : minute);
				latestString += "<br /> av ";
				latestString += forum.getElementsByTagName("user")[0].text;
				
				var ID = forum.getElementsByTagName("forumID")[0].text;
				document.getElementById("forum" + ID).style.display = "inline";
				document.getElementById("latest" + ID).innerHTML = latestString;
			}
		}
	};
	
	request.open("GET", url, true);
	request.send(null);	
}

function reloadThings() {
	if(url.indexOf("duel.php") != -1) {
		reloadDuel();
	}else if(url.indexOf("forum.php") == url.length - 9) {
		updateForums();
	}
}

function historyHack() {
	var hash = window.location.hash;
	hash = hash.substr(1, hash.length - 1);

	if(hash != this.url) {
		var result = hash.indexOf(".");
		if(result != -1) {
			loadContent(hash);
		}
	}
}

function load() {	
	var page = location.href.substring(location.href.lastIndexOf("/") + 1, location.href.length);

	if(page.indexOf("#") != -1) {
		page = page.substring(0, page.indexOf("#"));
	}

	this.url = page;
	
	setInterval(historyHack, 100);
	setInterval(reloadThings, 10000);
}
