/*
 * Javascript instant chat client.
 * Now less hideously inefficient!
 * (C) Copyright 2006 Andrew Knight
 */

var xmlhttp = getXmlHttp();
var xmlhttpdata = getXmlHttp();
var xmlhttpuser = getXmlHttp();
var timer;
var pollInterval = 3000;
var serverScriptPath = '/chat/chat.php';

if(xmlhttp)
	addLoadEvent(checkChatId);

window.onunload = function() {clearTimeout(timer);}

function checkChatId() {
	xmlhttp.open('GET', serverScriptPath + '?action=counters',true);
	xmlhttp.onreadystatechange=function() {
		if (typeof xmlhttp=='undefined' || xmlhttp.readyState!=4) return;
		
		response = xmlhttp.responseText;
		
		if(response == 'x') {
			document.getElementById('chatBox').innerHTML = 'Chat box disabled';
			document.getElementById('chatUsers').innerHTML = '';
			return;
		}
		
		chatId = response.substring(0,response.indexOf('%'));
		userId = response.substring(response.indexOf('%')+1,response.length);
		
		var updated = false;
		
		if(chatId != latestChatId) {
			updateFrame();
			latestChatId = chatId;
			updated = true;
		}
		
		if(userId != latestUserId) {
			updateUserList();
			latestUserId = userId;
			updated = true;
		}
		
		if(updated) return;
		
		timer = setTimeout('checkChatId()',pollInterval);
	}
	xmlhttp.send(null);
}

function updateFrame() {
	xmlhttpdata.open('GET', serverScriptPath + '?action=chatdata',true);
	xmlhttpdata.onreadystatechange=function() {
		if (typeof xmlhttpdata=='undefined' || xmlhttpdata.readyState!=4) return;
		chatButtonEnabled(true);
		document.getElementById('chatBox').innerHTML = xmlhttpdata.responseText;
		setTimeout('scrollBox()',50);
		clearTimeout(timer);
		timer = setTimeout('checkChatId()',pollInterval);
	}
	xmlhttpdata.send(null);
}

function updateUserList() {
	xmlhttpuser.open('GET', serverScriptPath + '?action=userdata',true);
	xmlhttpuser.onreadystatechange=function() {
		if (typeof xmlhttpuser=='undefined' || xmlhttpuser.readyState!=4) return;
		document.getElementById('chatUsers').innerHTML = xmlhttpuser.responseText;
		clearTimeout(timer);
		timer = setTimeout('checkChatId()',pollInterval);
	}
	xmlhttpuser.send(null);
}

function sendChat() {
	
	if(document.chatForm.chatInput.value=='') return false;
	var xh = getXmlHttp();
	if(!xh) return true;
	chatButtonEnabled(false);
	clearTimeout(timer);
	
	xh.open('POST', serverScriptPath + '?action=post',true);
	xh.onreadystatechange=function() {
		if(xh.readyState!=4) return;
		checkChatId();
	}
	xh.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	message = escape(document.chatForm.chatInput.value.replace(/ /g, "+"));
	xh.send('chatInput='+message);
	
	document.chatForm.chatInput.value = '';
	
	return false;
}

function chatButtonEnabled(state) {
	if(!document.chatForm) return;
	document.chatForm.hasPostedChat.disabled = !state;
	document.chatForm.hasPostedChat.className = state?'userInput':'userInputDisabled';
	document.chatForm.hasPostedChat.value = state?'Post Message':'Posting Message...';
}

function getXmlHttp() {
	var xh = false;
	
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	try {
		xh = new ActiveXObject('Msxml2.XMLHTTP');
	} catch (e) {
		try {
			xh = new ActiveXObject('Microsoft.XMLHTTP');
		} catch (E) {
			xh = false;
		}
	}
	@end @*/
	if (!xh && typeof XMLHttpRequest!='undefined') {
		xh = new XMLHttpRequest();
	}
	return xh;
}

function scrollBox() {
	var chatBox = document.getElementById('chatBox');
	chatBox.scrollTop = chatBox.scrollHeight - chatBox.clientHeight;
}
