var stop = 0;
var room = 'crypt';
var roomlist;
var userid = new Array();

function postIfEnter(e) {
    if (e.keyCode == 13) {
        postMessage();
        return false;
    }
    else {
        return true;
    }
}

function addUser(uid, handle) {
    userid[handle] = uid;
}

function getUA() {
    var ua;
    try {
        // Firefox, Opera 8.0+, Safari
        ua = new XMLHttpRequest();
    }
    catch (e) {
        // Internet Explorer
        try {
            ua = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e) {
            try {
              ua = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                alert("Your browser does not support AJAX!");
                return false;
            }
        }
    }

    return ua;
}

function switchRoom() {
    var roomJump = document.getElementById('roomJump');
    if (roomJump.options.length > 0) {
        room = roomJump.options[roomJump.selectedIndex].value;
        enterRoom();
    }
}

function getMessages() {
    if (stop) return false;
    var ua = getUA();

    if (ua) {
        ua.open('GET', '/ajax/chatIn.ez?x=' + Math.random(), true);
	ua.onreadystatechange = function() {
	    if (ua.readyState == 4) {
	        if (ua.status == 200) {
	            if (ua.responseText.match(/^FAIL:(.*)/)) {
		        alert(/^FAIL:(.*)/.exec(ua.responseText)[1]);
			stopChat();
		        return false;
		    }
                    else if (ua.responseText.match(/^STALL:(.*)/)) {
                        document.getElementById('errlog_getMessages').innerHTML = 'getMessages: ' + /^STALL:(.*)/.exec(ua.responseText)[1];
                        setTimeout('getMessages()', 500);
                    }
		    else {
                        var chat_messages = document.getElementById('chat_messages');
                        chat_messages.innerHTML = ua.responseText;
		        document.getElementById('errlog_getMessages').innerHTML = '';
                        chat_messages.scrollTop = chat_messages.scrollHeight;
		        setTimeout('getMessages()', 1000);
                    }
		}
	    }
	}
        ua.send(null);
    }
    else {
        alert('Can\'t activate chat agent');
    }
}

function getUsers() {
    if (stop) return false;
    var ua = getUA();

    if (ua) {
        ua.open('GET', '/ajax/chatUsers.ez?x=' + Math.random(), true);
        ua.onreadystatechange = function() {
            if (ua.readyState == 4) {
                if (ua.responseText.match(/^FAIL:(.*)/)) {
                    alert(/^FAIL:(.*)/.exec(ua.responseText)[1]);
		    stopChat();
                    return false;
                }
                else if (ua.responseText.match(/^STALL:(.*)/)) {
                    document.getElementById('errlog_getUsers').innerHTML = 'getUsers: ' + /^STALL:(.*)/.exec(ua.responseText)[1];
                    setTimeout('getUsers()', 1000);
                }
                else {
		    var users = eval('(' + ua.responseText + ')');
                    document.getElementById('chat_users').innerHTML = users.html;
		    for (i in users.userids) {
		        addUser(users.userids[i].uid, users.userids[i].handleid);
		    }
		    document.getElementById('errlog_getUsers').innerHTML = '';
                    setTimeout('getUsers()', 2000);
                }
            }
        }
        ua.send(null);
    }
    else {
        alert('Can\'t activate users agent');
    }
}

function getRooms() {
    if (stop) return false;
    var ua = getUA();
    if (ua) {
        ua.open('GET', '/ajax/chatRooms.ez?x=' + Math.random(), true);
	ua.onreadystatechange = function() {
	    if (ua.readyState == 4) {
	        if (ua.status == 200) {
		    roomlist = eval('(' + ua.responseText + ')');
		    if (roomlist) {
		        if (roomlist.stall) {
			    document.getElementById('errlog_getRooms').innerHTML = roomlist.stall;
			    setTimeout('getRooms()', 500);
			}
			else {
			    popRooms();
			    document.getElementById('errlog_getRooms').innerHTML = '';
			    setTimeout('getRooms()', 60000);
			}
		    }
		}
		else {
		    document.getElementById('errlog_getRooms').innerHTML = 'Could not fetch room list';
		}
	    }
	}
        ua.send(null);
    }
    else {
        alert('Can\'t activate rooms agent');
    }
}

function popRooms() {
    if (!roomlist) {
        document.getElementById('errlog_getRooms').innerHTML = 'popRooms called without roomlist... WTF?';
	return false;
    }

    var roomJump = document.getElementById('roomJump');
    if (roomJump) {
        roomJump.options.length = 0;

        var idx = 0;

        for (i in roomlist.rooms) {
            roomJump.options[i] = new Option(roomlist.rooms[i].name,
	                                     roomlist.rooms[i].id);
            if (roomlist.rooms[i].id == room) {
	        idx = i;
	    }
        }

        roomJump.selectedIndex = idx;
    }
}

function enterRoom() {
    var ua = getUA();
    if (ua) {
        ua.open('GET', '/ajax/enterChatRoom.ez?x=' + Math.random() + '&room=' + encodeURIComponent(room), true);
        ua.onreadystatechange = function() {
            if (ua.readyState == 4) {
                if (ua.responseText.match(/^FAIL:(.*)/)) {
                    alert(/^FAIL:(.*)/.exec(ua.responseText)[1]);
                }
                else if (ua.responseText.match(/^STALL:(.*)/)) {
                    document.getElementById('errlog_enterRoom').innerHTML = 'enterRoom: ' + /^STALL:(.*)/.exec(ua.responseText)[1];
                    setTimeout('enterRoom()', 500);
                }
                else if (ua.responseText.match(/^NEWROOM:(.*)/)) {
                    document.getElementById('currentRoom').innerHTML = /^NEWROOM:(.*)/.exec(ua.responseText)[1];
		    document.getElementById('errlog_enterRoom').innerHTML = '';
                    getMessages();
                    getUsers();
		    getRooms();
                }
                else {
                    document.getElementById('currentRoom').innerHTML = 'Something went awry...';
                }
            }
        }
        ua.send(null);
    }
    else {
        alert('Can\'t activate room-enter agent');
    }
}

var alreadyLoggingOut = 0;

function logout(manual) {
    // alert('Manual logout? ' + manual);
    if (alreadyLoggingOut) return void(0);
    alreadyLoggingOut = 1;
    var ua = getUA();
    if (ua) {
        ua.open('GET', '/ajax/quitChat.ez');
        ua.onreadystatechange = function() {
            if (ua.readyState == 4) {
	        if (ua.responseText.match(/^FAIL:/)) {
		    alert(/^FAIL:(.*)/.exec(ua.responseText)[1]);
		}
		else if (ua.responseText.match(/^STALL:/)) {
		    alreadyLoggingOut = 0;
		    setTimeout('logout()', 500);
		}
		else if (ua.responseText.match(/^REDIRECT:/)) {
		    if (manual === 1) {
		        document.location = /^REDIRECT:(.*)/.exec(ua.responseText)[1];
		    }
		}
	    }
        }
        ua.send(null);
	return void(0);
    }
    else {
        if (manual === 1) {
            alert('Can\'t activate logout agent');
	}
	else {
            return "Can't  active logout agent";
	}
    }
}

window.onbeforeunload=logout;

function startChat() {
    stop = 0;
    enterRoom();
    document.getElementById('startButton').style.display = 'none';
    document.getElementById('stopButton').style.display = '';
    // getMessages();
    // getUsers();
}

function stopChat() {
    stop = 1;
    document.getElementById('stopButton').style.display = 'none';
    document.getElementById('startButton').style.display = '';
}

function postMessage() {
    var message = document.getElementById('message').value;
    if (!message) return false;
    if (message.length > 10 && (message.match(/[A-Z]/) && ! message.match(/[a-z]/))) {
        alert("Please stop shouting. I'm not going to let you post that.");
	return false;
    }
    // alert(message);
    var ua = getUA();
    if (ua) {
        var postURL = '/ajax/chatPost.ez?x=' + Math.random() + '&message=' + encodeURIComponent(message);
	if (document.getElementById('pmhandle').value || document.getElementById('pmto').value) {
	    if (document.getElementById('pmto').value) {
	        postURL += '&pmto=' + document.getElementById('pmto').value;
	    }
	    else {
	        var handleid = document.getElementById('pmhandle').value.toLowerCase();
		handleid = handleid.replace(/[\W_]+/g, '_');
		handleid = handleid.replace(/_+/g, '_');
		handleid = handleid.replace(/^_/, '');
		handleid = handleid.replace(/_$/, '');

	        if (userid[handleid]) {
	            postURL += '&pmto=' + userid[handleid];
	        }
	        else {
	            alert('Invalid PM recipient ' +  document.getElementById('pmhandle').value + '(' + handleid + ')');
		    document.getElementById('pmhandle').value = '';

		    return false;
                }
	    }
	}

        ua.open('GET', postURL, true);
	document.getElementById('message').disabled = true;
	document.getElementById('postButton').disabled = true;
	ua.onreadystatechange = function() {
	    if (ua.readyState == 4) {
	        if (ua.responseText.match(/^FAIL:(.*)/)) {
		    alert(/^FAIL:(.*)/.exec(ua.responseText)[1]);
		    document.getElementById('message').disabled = false;
		    document.getElementById('postMessage').disabled = false;
		}
                else if (ua.responseText.match(/^STALL:(.*)/)) {
                    document.getElementById('errlog_postMessage').innerHTML = 'postMessage: ' + /^STALL:(.*)/.exec(ua.responseText)[1];
		    setTimeout('postMessage()', 500);
                }
		else {
		    document.getElementById('message').disabled = false;
		    document.getElementById('message').value = '';
		    document.getElementById('errlog_postMessage').innerHTML = '';
		    document.getElementById('postButton').disabled = false;
		    document.getElementById('message').focus();
		}
	    }
	}
	ua.send(null);
    }
    else {
        alert('Can\'t activate post agent');
    }
}

