// -- Configuration Parameters
var gRoomName = '';
var gMOTD = '';
var gSessionID = '000000000000000000000000000000000000000000';
var gLastEventID = 0;
var gUserName = '';
var gPoll = true;
var gGotStartupEvents = false;
var gChatServerUp = true;
var gPassword = '';
var gTimer = 0;

var USER_JOINED_ROOM = 1;
var USER_LEFT_ROOM = 2;
var USER_MESSAGE = 3;
var USER_CHANGE_TIER = 4;
var USER_ROOM_TITLE_CHANGE = 5;
var USER_KICKED = 6;
var USER_STREAM_CHANGED = 7;
var USER_ROOM_MOTD_CHANGE = 8;

var FAIL_SERVER_DOWN = 0;
var FAIL_NEED_PASSWORD = 4;

function Browser()
{
	var ua, s, i;

	this.isIE    = false;
	this.isNS    = false;
	this.version = null;

	ua = navigator.userAgent;

	s = "MSIE";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isIE = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}

	s = "Netscape6/";
	if ((i = ua.indexOf(s)) >= 0) 
	{
		this.isNS = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}

    // Treat any other "Gecko" browser as NS 6.1.

	s = "Gecko";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isNS = true;
		this.version = 6.1;
		return;
	}
}

var dragObj = new Object();
browser = new Browser();

// -- AJAX implementation --
function WebChatEscape(str)
{

	var t = str.replace(/&/g,'&amp;').
			replace(/>/g,'&gt;').
			replace(/</g,'&lt;').
			replace(/\'/g,'&#39;').
			replace(/\"/g,'&quot;').
            replace(/(http:\/\/\S+)/, '<a href="$1" target="_new">$1</a>');

	return t;
}

function WebChatInit(roomname, username, sessionid, motd)
{
	gRoomName = roomname;
	gUserName = username;

	WebChatUpdateMOTD(motd);

	if (sessionid != '')
		gSessionID = sessionid;

	WebChatGetUserList();
}

function WebChatSendMessage(message)
{
	if (!message.length)
		return;

	var params =
	{
		'ajax': true,
		'cmd': 'sendmessage',
		'msg': message,
		'sid': gSessionID
	};

	AjaxRequest.post(
		{
			'url': '/webchat/' + gRoomName + '/',
			'parameters': params,
			'onSuccess': function(resp) { gChatServerUp = onSendMessageSuccess(resp); },
			'onError': onSendMessageError
		}
	);
}

/* MOXTODO
function WebChatSetMOTD(message_of_the_day)
{
	if (!message.length)
		return;
	
	var params = 
	{
		'ajax': true,
		'cmd' : 'setmotd',
		'msg' : message_of_the_day,
		'sid' : gSessionID
	};

	AjaxRequest.post(
		{
			'url': '/webchat/' + gRoomName + '/',
			'parameters' : params,
			'onSuccess' : onSetMOTDSuccess,
			'onError' : onSetMOTDError
		}
	);
}
*/

function WebChatJoinRoom(password)
{
	gPassword = password;
	var params =
	{
		'ajax': true,
		'cmd': 'joinroom',
		'password': password
	};

	AjaxRequest.post(
		{
			'url': '/webchat/' + gRoomName + '/',
			'parameters': params,
			'onSuccess': onJoinRoomSuccess,
			'onError': onJoinRoomError
		}
	);
}

function WebChatPoll()
{
	var params =
	{
		'ajax': true,
		'cmd': 'getevents',
		'sid': gSessionID,
		'lastid': gLastEventID
	};

	AjaxRequest.get(
		{
			'url': '/webchat/' + gRoomName + '/',
			'parameters': params,
			'onSuccess': onPollSuccess,
			'onError': onPollError
		}
	);
}

function WebChatGetUserList()
{
	var params =
	{
		'ajax': true,
		'cmd': 'getuserlist',
		'sid': gSessionID
	};

	AjaxRequest.get(
		{
			'url': '/webchat/' + gRoomName + '/',
			'parameters': params,
			'onSuccess': onGetUsersSuccess,
			'onError': onGetUsersError
		}
	);
}

function WebChatAddUser(user)
{
	WebChatRemoveUser(user);

	var usersDiv = document.getElementById('webchat_users');

	var a = document.createElement("a");
	var text = document.createTextNode(user.nickname ? user.nickname : user.username);
	a.appendChild(text);
	a.href = "/profile/" + user.username + "/";
	a.onmouseover = onMouseOver;
	a.onmouseout = onMouseOut;
	a.setAttribute("username", user.username);
	a.setAttribute("userid", user.userid);
	a.setAttribute("nickname", user.nickname);
	a.setAttribute("target", "_new");
	a.className = 'webchat_user';

	var div = document.createElement("div");
	div.setAttribute("username", user.username);
	div.setAttribute("userid", user.userid);
	div.setAttribute("nickname", user.nickname);
	div.className = 'webchat_user';
	div.appendChild(a);
	
	usersDiv.appendChild(div);
}

function WebChatFindUser(username)
{
	var usersDiv = document.getElementById('webchat_users');
	var child = usersDiv.firstChild;
	var display
	while (child)
	{
		if (child.getAttribute("username") == username)
			break;

		child = child.nextSibling;
	}

	return child
}

function WebChatRemoveUser(user)
{
	child = WebChatFindUser(user.username);
	if (child)
	{
		var usersDiv = document.getElementById('webchat_users');
		usersDiv.removeChild(child);
	}
}

function WebChatAddSystemMessage(msg)
{
	var chatText = document.getElementById('webchat_text');
	var scrollBottom = (chatText.scrollHeight - chatText.scrollTop) ==  chatText.clientHeight;
	var div = document.createElement("div");
	div.setAttribute("class", "webchat_info");
	div.className = "webchat_info";
	var text = document.createTextNode('<' + msg + '>');
	div.appendChild(text);
	chatText.appendChild(div);

	if (scrollBottom)
		chatText.scrollTop = chatText.scrollHeight;
}

function WebChatUpdateMOTD(msg)
{
	gMOTD = msg;
	var chatmsg = 'Message of the day: "' + gMOTD + '"';
	WebChatAddSystemMessage(chatmsg);
	// update header
	//document.getElementById("room_motd_" + gRoomName).textContent = gMOTD;
	var motddiv = document.getElementById("room_motd_" + gRoomName);
	if (motddiv)
		motddiv.innerHTML = gMOTD;
}

function WebChatGetDisplayName(user)
{
	if (user.nickname)
		return user.nickname + " (" + user.username + ")";
	else
		return user.username;
}

function WebChatParseSlashCommand(timestamp, name, msg)
{
	var chatText = document.getElementById('webchat_text');

	if (msg.indexOf("/me") == 0)
	{
		var div = document.createElement("div");
		div.className = 'webchat_user_msg';
		div.innerHTML = timestamp + " " + msg.replace("/me", "*" + name);
		chatText.appendChild(div);
	}
}

function WebChatProcessEvents(events)
{
	var userList = document.getElementById('webchat_users');
	var chatText = document.getElementById('webchat_text');
	var scrollBottom = (chatText.scrollHeight - chatText.scrollTop) ==  chatText.clientHeight;
	var lastEventID = 0;
	var firstEvents = false;

	if (!gGotStartupEvents && events.length == 0)
	{
		gGotStartupEvents = true;
		firstEvents = true;
	}
		
	// always skip first poll event upon joining a room
	if ((events.length > 0) && 
		(gLastEventID == 0))
	{
		gLastEventID = events[events.length - 1].id;
		return;
	}

	for (var i = 0; i < events.length; i++)
	{
		var event = events[i];
		lastEventID = event.id;

		if (event.type == USER_JOINED_ROOM)
		{
			var name_arr = gRoomName.split("-");
			if ((name_arr.length == 1) ||
				((name_arr.length > 1) && (name_arr[0] != "live"))
			   )
			{
				var displayname = WebChatGetDisplayName(event);
				var msg = displayname + ' has entered the room'
				WebChatAddSystemMessage(msg);
			}

			if (!firstEvents)
				WebChatAddUser(event);
		}
		else if (event.type == USER_LEFT_ROOM)
		{
			var name_arr = gRoomName.split("-");
			if ((name_arr.length == 1) ||
				((name_arr.length > 1) && (name_arr[0] != "live"))
			   )
			{
				var displayname = WebChatGetDisplayName(event);
				var msg = displayname + ' has left the room';
				WebChatAddSystemMessage(msg);
			}

			WebChatRemoveUser(event);
		}	 
		else if (event.type == USER_MESSAGE)
		{
			var displayname = event.nickname ? event.nickname : event.username;
			var date = new Date(event.ts * 1000);
			var hours = date.getHours();
			var minutes = date.getMinutes();
			if (hours < 10)
				hours = "0" + hours;
			if (minutes < 10)
				minutes = "0" + minutes;
			var time = "<b>[" + hours + ":" + minutes + "]</b>";
			if (event.message.charAt(0) == '/')
			{
				WebChatParseSlashCommand(time, WebChatEscape(displayname), event.message);
			}
			else
			{
				var div = document.createElement("div");
				div.innerHTML = time + " <b>" + WebChatEscape(displayname) + ":</b> " + WebChatEscape(event.message);
				if (event.username == gUserName)
					div.className = 'webchat_user_my_msg';
				else
					div.className = 'webchat_user_msg';
				chatText.appendChild(div);
			}
		}
		else if (event.type == USER_CHANGE_TIER)
		{
			// TODO: ???
		}
		else if (event.type == USER_ROOM_TITLE_CHANGE)
		{
			var displayname = WebChatGetDisplayName(event);
			var msg = 'The room title is now "' + event.message + '"';
			WebChatAddSystemMessage(msg);
		}
		else if (event.type == USER_KICKED)
		{
			if (gUserName == event.username)
			{
				var displayname = WebChatGetDisplayName(event);
				var msg = 'You logged into another web session.';
				WebChatAddSystemMessage(msg);
			}
		}
		else if (event.type == USER_STREAM_CHANGED)
		{
			// we reload the page
			//window.location.reload();
			//var msg = 'Stream has restarted. Click <a href="#" onclick="window.location.reload">here</a> to refresh the page.';
			var j = 0;
			var info = event.message.split("\n");
			var title = info[j++];
			var desc = info[j++];
			var sid = info[j++];
			var thumbnail = info[j++];
			var host = info[j++];
			var dport = info[j++];
			var cport = info[j++];
			var key = info[j++];
			var is_private = info[j++];
			
			if (host.length > 0 && gGotStartupEvents)
			{
				var stream = document.getElementById("stream_over");
				if (stream && stream.style.display == "block" && open_dyyno_player)
				{
					window.location.reload();

					// TODO: When dyyno fixes open_dyyno_player() to be allowed to be
					// called multiple times so we don't have to reload
					//open_dyyno_player(host, dport, cport, sid);
				}
			}
		}
		else if (event.type == USER_ROOM_MOTD_CHANGE)
		{
			var msg = WebChatEscape(event.message);
			if (msg != gMOTD)
			{
				WebChatUpdateMOTD(msg);
			}
		}
	}

	if (lastEventID > 0)
		gLastEventID = lastEventID;

	if (scrollBottom)
		chatText.scrollTop = chatText.scrollHeight;
}

function WebChatStartDrag(event, obj)
{
	var el;
	var x, y;

	// If an element id was given, find it. Otherwise use the element being
	// clicked on.
	dragObj.elNode = obj;

	// Get cursor position with respect to the page.

	if (browser.isIE)
	{
		x = window.event.clientX + document.documentElement.scrollLeft
			+ document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop
			+ document.body.scrollTop;
	}
	if (browser.isNS)
	{
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}

	// Save starting positions of cursor and element.

	dragObj.cursorStartX = x;
	dragObj.cursorStartY = y;
	dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
	dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);

	if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
	if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;

	// Capture mousemove and mouseup events on the page.

	if (browser.isIE)
	{
		document.attachEvent("onmousemove", onDragGo);
		document.attachEvent("onmouseup", onDragStop);
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (browser.isNS) 
	{
		document.addEventListener("mousemove", onDragGo, true);
		document.addEventListener("mouseup", onDragStop, true);
		event.preventDefault();
	}

	// show transparent div
	div = document.getElementById("webchat_gripper_transparent");
	if (div)
	{
		div.style.display = 'block';
		div.style.width = obj.clientWidth + 'px';
		div.style.height = obj.clientHeight + 'px';
		div.style.top = y + 'px';
	}
}

function WebChatPromptPassword()
{
	gPoll = false;

	pwdiv = document.getElementById('webchat_password_container');
	pwdiv.style.display = 'block';

	chatdiv = document.getElementById('webchat_container');
	chatdiv.style.display = 'none';
}

// -- callbacks --
function onDragGo(event)
{
	var x, y;

	// Get cursor position with respect to the page.

	if (browser.isIE)
	{
		x = window.event.clientX + document.documentElement.scrollLeft
			+ document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop
			+ document.body.scrollTop;
	}
	if (browser.isNS)
	{
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}

	// show transparent div
	div = document.getElementById("webchat_gripper_transparent");
	if (div)
		div.style.top = y + 'px';

	if (browser.isIE)
	{
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (browser.isNS)
		event.preventDefault();
}

function onDragStop(event)
{
	var x, y;

	// Get cursor position with respect to the page.

	if (browser.isIE)
	{
		x = window.event.clientX + document.documentElement.scrollLeft
			+ document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop
			+ document.body.scrollTop;
	}
	if (browser.isNS)
	{
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}

	var text = document.getElementById("webchat_text");
	var users = document.getElementById("webchat_users");
	var diff = y - dragObj.cursorStartY;
	if (text.clientHeight + diff < 50)
	{
		y = 50 - text.clientHeight + dragObj.cursorStartY;
	}
	if (users.clientHeight - diff < 50)
	{
		y = users.clientHeight + dragObj.cursorStartY - 50;
	}
	var padding = 10;
	text.style.height = (text.clientHeight + (y - dragObj.cursorStartY) - padding) + 'px';
	users.style.height = (users.clientHeight - (y - dragObj.cursorStartY) - padding) + 'px';

	// Clear the drag element global.

	dragObj.elNode = null;

	// show transparent div
	var div = document.getElementById("webchat_gripper_transparent");
	if (div)
	{
		div.style.display = 'none';
	}

	// Stop capturing mousemove and mouseup events.

	if (browser.isIE)
	{
		document.detachEvent("onmousemove", onDragGo);
		document.detachEvent("onmouseup", onDragStop);
	}
	if (browser.isNS)
	{
		document.removeEventListener("mousemove", onDragGo, true);
		document.removeEventListener("mouseup", onDragStop, true);
	}
}

function onKeyPress(event, obj)
{
	if (event.keyCode == 13)
	{
		input = document.getElementById('webchat_msg');
		WebChatSendMessage(input.value);
		input.value = '';
		return false;
	}
}

function onPasswordKeyPress(event, obj)
{
	if (event.keyCode == 13)
	{
		onEnterPassword();
	}
}

function onEnterPassword()
{
	var input = document.getElementById('webchat_password');
	WebChatJoinRoom(input.value);
	input.value = '';
}

function onSend()
{
	var input = document.getElementById('webchat_msg');
	WebChatSendMessage(input.value);
	input.value = '';
}

function onSendMessageError(response)
{
	//alert('send message failed');
}

function onSendMessageSuccess(response)
{
	var xml = response.responseXML.documentElement;
	if (!xml) return;
	var result = xml.getElementsByTagName("message_sent");
	if (!result)
	{
		WebChatAddSystemMessage('Message not sent');
		return false;
	}
	return true;
}

function onPollError(response)
{
	//alert('poll failed');
	if (gPoll)
		setTimeout("WebChatPoll()", 5000);
}

function onPollSuccess(response)
{
	var xml = response.responseXML.documentElement;
	if (!xml) return;
	var events = xml.getElementsByTagName("event");
	var eventsArray = new Array();

	if (xml.nodeName == "get_events_error")
	{
		var errorCode = xml.childNodes[0].nodeValue;
		if (errorCode == FAIL_NEED_PASSWORD)
		{
			gPoll = false;
			WebChatAddSystemMessage('Chatroom requires a password.  You need to log in to your Xfire account to enter the chatroom.');
		}
		else if (errorCode == FAIL_SERVER_DOWN)
		{
			if (gChatServerUp)
			{
				WebChatAddSystemMessage('Javascript error or the chat is down');
				WebChatAddSystemMessage('Please wait...');
				gChatServerUp = false;
			}
		}
	}
	else
	{		
		if (!gChatServerUp)
		{
			gLastEventID = 0;
			WebChatGetUserList();
			WebChatJoinRoom(gPassword);
			WebChatAddSystemMessage("We're back!");
			gChatServerUp = true;
		}
	}

	for (var i = 0; i < events.length; i++)
	{
		var event = events[i];
		var eventData = {};
		for (var j = 0; j < event.childNodes.length; j++)
		{
			var prop = event.childNodes[j];
			if (prop.nodeName == "#text")
				continue;
			var key = prop.nodeName;
			var value = '';
			if (prop.childNodes.length)
				value = prop.childNodes[0].nodeValue;
			eventData[key] = value;
		}
		eventsArray.push(eventData);
	}

	WebChatProcessEvents(eventsArray);

	if (gPoll)
		setTimeout("WebChatPoll()", 3000);
}

function onJoinRoomError(response)
{
	//alert('join room failed');
}

function onJoinRoomSuccess(response)
{
	var xml = response.responseXML.documentElement;
	if (!xml) return;
	var sids = xml.getElementsByTagName("sid");
	var sid = '000000000000000000000000000000000000000000';

	if (sids.length > 0)
	{
		sid = sids[0].childNodes[0].nodeValue;

		var pwdiv = document.getElementById('webchat_password_container');
		pwdiv.style.display = 'none';

		var chatdiv = document.getElementById('webchat_container');
		chatdiv.style.display = 'block';

		var tmpMOTD = WebChatEscape(document.getElementById('motd').textContent);
		WebChatInit(gRoomName, gUserName, sid, tmpMOTD);
	}

	// don't display passworded room.
	// incorrect pwd is displayed in the room
	/*
	else
	{
		alert('Incorrect password. Please try again.');
	}
	*/
}

function onGetUsersError(response)
{
	//alert('get users failure');
}

function onGetUsersSuccess(response)
{
	var xml = response.responseXML.documentElement;
	if (!xml) return;
	var users = xml.getElementsByTagName("user");
	var usersArray = new Array();

	for (var i = 0; i < users.length; i++)
	{
		var user = users[i];
		var userData = {};
		for (var j = 0; j < user.childNodes.length; j++)
		{
			var prop = user.childNodes[j];
			if (prop.nodeName == "#text")
				continue;
			var key = prop.nodeName;
			var value = '';
			if (prop.childNodes.length)
				value = prop.childNodes[0].nodeValue;
			userData[key] = value;
		}
		usersArray.push(userData);
	}

	// clear the users
	var usersDiv = document.getElementById('webchat_users');
	usersDiv.innerHTML = '';
	for (var i = 0; i < usersArray.length; i++)
	{
		var user = usersArray[i];
		WebChatAddUser(user);

		// TODO: Put alt= tag
	}
}

function onSetMOTDSuccess(response)
{
	//alert('MOTD success');
	var xml = response.responseXML.documentElement;
	if (!xml) return;
	var result = xml.getElementsByTagName("message_sent");
	if (!result)
	{
		WebChatAddSystemMessage('MOTD updated');
	}
}

function onSetMOTDError(response)
{
	//alert('MOTD failure');
	//var xml = response.responseXML.documentElement;
	//var result = xml.getElementsByTagName("message_sent");
	//if (!result)
	//{
	//	WebChatAddSystemMessage('MOTD not changed');
	//}
}

function onMouseOver(event)
{
	//for (var i in event)
	//	msg += i + ": " + event[i] + "<br/>";

	var el = null;
	if (browser.isIE)
	{
		event = window.event;
		el = event.srcElement;
	}
	if (browser.isNS)
	{
		el = event.target;
	}
	var tt = document.getElementById('webchat_tooltip');
	tt.style.display = 'block';
	tt.innerHTML = 
		'Username: ' + WebChatEscape(el.getAttribute('username')) + '<br/>' +
		'Nickname: ' + WebChatEscape(el.getAttribute('nickname')) + '<br/>';

	document.onmousemove = onMouseMove;
}

function onMouseMove(event)
{
	var x, y;

	if (browser.isIE)
	{
		x = window.event.clientX + document.documentElement.scrollLeft
			+ document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop
			+ document.body.scrollTop;
	}
	if (browser.isNS)
	{
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}

	var tt = document.getElementById('webchat_tooltip');
	tt.style.left = (x + 10) + 'px';
	tt.style.top = (y + 10) + 'px';
}

function onMouseOut(event)
{
	var tt = document.getElementById('webchat_tooltip');
	tt.style.display = 'none';
	document.onmousemove = null;
}

function onButtonClick()
{
	//return false;
}

// -- Where the Magic Happens --
setTimeout("WebChatPoll()", 3000);
