function updateUserlistAJAX(url) {
	// native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		reqUserlist = new XMLHttpRequest();
		reqUserlist.onreadystatechange = function() {updateUserlistAJAXDone();};
		reqUserlist.open("GET", url, true);
		reqUserlist.send(null);
	// IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		reqUserlist = new ActiveXObject("Microsoft.XMLHTTP");
		if (reqUserlist) {
		reqUserlist.onreadystatechange = function() {updateUserlistAJAXDone();};
		reqUserlist.open("GET", url, true);
		reqUserlist.send();
		}
	}
}

function updateUserlistAJAXDone() {
	// only if req is "loaded"
	if (reqUserlist.readyState == 4) {
		// only if "OK"
		if (reqUserlist.status == 200) {
			resultsUserlist = reqUserlist.responseText;
			resultsUserlist = resultsUserlist.split("\n");

			userlist_lasttime = resultsUserlist.shift();
			if(document.location.href.indexOf("chat.php") > -1){
				switch(userlist_lasttime){
					case "timeout":
						var chat_href = document.location.href;
						chat_href = chat_href.substring(0, chat_href.indexOf("&t="));
						document.body.innerHTML = "<div><a href=\"" + chat_href + "\" style=\"color:white\">Timed out. Click here to log in again</a></div>";
						window.clearInterval(updateChatlogIntervalID);
						window.clearInterval(updateUserlistIntervalID);
						break;
					case "duplicate":
						document.body.innerHTML = "<div><a href=\"./\" style=\"color:white\">The selected nick is in use. Click here to log in again</a></div>";
						window.clearInterval(updateChatlogIntervalID);
						window.clearInterval(updateUserlistIntervalID);
						break;
					default:
						document.getElementById("userlist").innerHTML = resultsUserlist.join("<br />");
						break;
				}
			}
			else{
				var nick = document.getElementById("nick").value;
				var password = document.getElementById("password").value;
				document.location.href = "chat.php?n=" + escape(nick) + "&p=" + password + "&t=" + userlist_lasttime;
			}
		}
	}
}

function updateChatlogAJAX(url) {
	// native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		reqChatlog = new XMLHttpRequest();
		reqChatlog.onreadystatechange = function() {updateChatlogAJAXDone();};
		reqChatlog.open("GET", url, true);
		reqChatlog.send(null);
	// IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		reqChatlog = new ActiveXObject("Microsoft.XMLHTTP");
		if (reqChatlog) {
		reqChatlog.onreadystatechange = function() {updateChatlogAJAXDone();};
		reqChatlog.open("GET", url, true);
		reqChatlog.send();
		}
	}
}

function updateChatlogAJAXDone() {
	// only if req is "loaded"
	if (reqChatlog.readyState == 4) {
		// only if "OK"
		if (reqChatlog.status == 200) {
			resultsChatlog = reqChatlog.responseText;
			resultsChatlog = resultsChatlog.split("\n");
			if(chatlog_lasttime != ""){
				chatlog_lasttime = resultsChatlog.shift();
				document.getElementById("chatarea").innerHTML += resultsChatlog.join(" ");
				scrollChatlog();
			}
			else chatlog_lasttime = resultsChatlog;
		}
	}
}

function postMessageAJAX(url) {
	// native XMLHttpRequest object
	document.getElementById("statusfield").innerHTML = 'sending...';
	if (window.XMLHttpRequest) {
		reqMessage = new XMLHttpRequest();
		reqMessage.onreadystatechange = function() {postMessageAJAXDone();};
		reqMessage.open("GET", url, true);
		reqMessage.send(null);
	// IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		reqMessage = new ActiveXObject("Microsoft.XMLHTTP");
		if (reqMessage) {
		reqMessage.onreadystatechange = function() {postMessageAJAXDone();};
		reqMessage.open("GET", url, true);
		reqMessage.send();
		}
	}
}

function postMessageAJAXDone() {
	// only if req is "loaded"
	if (reqMessage.readyState == 4) {
		// only if "OK"
		if (reqMessage.status == 200) {
			results = reqMessage.responseText;
			document.getElementById("statusfield").innerHTML = results;
			window.clearInterval(updateChatlogIntervalID);
			setChatlogInterval();
		} else {
			document.getElementById("statusfield").innerHTML="Error:\n" +
			reqMessage.statusText;
		}
		var typefield = document.getElementById("typefield");
		var typefield_disabled = document.getElementById("typefield_disabled");

		typefield.value = "";
		typefield.style.display = "inline";
		typefield_disabled.style.display = "none";
		typefield.select();
	}
}

function lTrim(strString) {
	var re = /\s*((\S+\s*)*)/;
	return strString.replace(re, "$1");
}

function rTrim(strString) {
	var re = /((\s*\S+)*)\s*/;
	return strString.replace(re, "$1");
}

function trim(strString) {
	return lTrim(rTrim(strString));
}

function postMessage(){
	var typefield = document.getElementById("typefield");
	var message = trim(typefield.value);

	if(message != ""){
		var typefield_disabled = document.getElementById("typefield_disabled");

		typefield_disabled.value = message;
		typefield_disabled.style.display = "inline";
		typefield.style.display = "none";

		while(message != message.replace("+", "%2B")) message = message.replace("+", "%2B");

		postMessageAJAX("./post.php?m=" + encodeURIComponent(message) + "&n=" + nick + "&c=" + colour);
	}
	else typefield.value = "";
}

function typefield_onkeyup(e){
	var k;
	if(window.event) k = e.keyCode;
	else if(e.which) k = e.which;
 
	if(k == 13) postMessage();
}

function loginfields_onenterpress(){
	var k;
	if(window.event) k = e.keyCode;
	else if(e.which) k = e.which;
 
	if(k == 13) document.getElementById("login_button").click();
}

function typeSmiley(smiley){
	var typefield = document.getElementById("typefield");
	typefield.value += " " + smiley;
	typefield.focus();
}

function scrollChatlog()
{
	chatarea = document.getElementById("chatarea");
	chatarea.scrollTop = chatarea.scrollHeight - chatarea.clientHeight;
}

function setChatlogInterval(){
	window.setTimeout(function(){updateChatlogAJAX("update.php?t=" + chatlog_lasttime);}, 1000, "javascript");
	updateChatlogIntervalID = window.setInterval(function(){updateChatlogAJAX("update.php?t=" + chatlog_lasttime);}, update_chatlog_interval_ms, "javascript");
}

function setUserlistInterval(){
	updateUserlistAJAX("userlist.php?n=" + nick + "&t=" + userlist_lasttime);
	updateUserlistIntervalID = window.setInterval(function(){updateUserlistAJAX("userlist.php?n=" + nick + "&t=" + userlist_lasttime);}, update_userlist_interval_ms, "javascript");
}

function bodyonload(){
	document.getElementById("typefield").select();
	postMessageAJAX("post.php?n=" + nick + "&s=1");
	setChatlogInterval();
	setUserlistInterval();
}
