var text = new Text();

function Chat() {
	var debug = false;
	
	var chat = this;
	
	var lastFetchId = null;
	var user = null;
	var timer = null;
	
	var poolInterval = 1000;
	
	var requestType = {
		INIT : "INIT",
		FETCH_MESSAGES : "FETCH_MESSAGES",
		POST_MESSAGE : "POST_MESSAGE",
		SIGN_IN : "SIGN_IN",
		SIGN_OUT : "SIGN_OUT"
	}
	
	var responseType = {
		CLOSED : "CLOSED",
		MESSAGES : "MESSAGES",
		NO_NEW_MESSAGES : "NO_NEW_MESSAGES",
		POST_SUCCESS : "POST_SUCCESS",
		SIGN_IN_SUCCESS : "SIGN_IN_SUCCESS",
		SIGN_OUT_SUCCESS : "SIGN_OUT_SUCCESS",
		SIGN_IN_USERNAME_TAKEN : "SIGN_IN_USERNAME_TAKEN",
		UNSIGNED_IN : "UNSIGNED_IN",
		RECONNECT_SUCCESS : "RECONNECT_SUCCESS"
	}
	
	this.init = function() {
		this.request(requestType.INIT, null);
		$('#signInButton').click(chat.signIn);
		$('#signOutButton').click(chat.signOut);
		$('#sendButton').click(chat.postMessage);
		$('#nicknameInput').keyup(function(event) {if(event.keyCode == 13) chat.signIn()});
		$('#messageInput').keyup(function(event) {if(event.keyCode == 13) chat.postMessage()});
	}
	
//----------------------------------------
// Event Handling
//----------------------------------------
	
	this.signIn = function() {
		var nickname = $.trim($('#nicknameInput').attr('value'));
		
		if(nickname == "")
			chat.displayErrorMessage(text.emptyUserName);
		else
			chat.request(requestType.SIGN_IN, {name : nickname})
	}
	
	this.signOut = function() {
		chat.request(requestType.SIGN_OUT, {name : user.name});
	}
	
	this.postMessage = function() {
		chat.request(requestType.POST_MESSAGE, {token : user.token, message : $.trim($('#messageInput').attr('value')) });
		$('#messageInput').attr('value', "");
	}
	
	this.fetchMessages = function() {
		chat.request(requestType.FETCH_MESSAGES, {lastFetchId : lastFetchId});
	}
	
	this.messagesReceived = function(data) {
		$.each(data, function(i, item) {
			chat.displayChatMessage(item.message_id, item.name, item.message);
			lastFetchId = item.message_id;
		})
		
		$(".chatMessage:even").addClass("chatMessageEven");
	}
	
	this.reconnect = function(data) {
		if(data.args.messages != null)
			chat.messagesReceived(data.args.messages);
		else
			lastFetchId = data.args.initid;
		
		timer = window.setTimeout("chat.fetchMessages()", poolInterval);
		
		chat.enableChat(data);
		chat.displayInfoMessage(text.welcome_pre + user.name + text.welcome_post);
	}

//----------------------------------------
// Request and Response Handling
//----------------------------------------
	
	this.request = function(type, data) {
		if(debug)
			chat.displayDebugMessage('Request dump: <br />' + JSON.stringify({request : type, args : data}) + '</p>');
		$.getJSON('chatprovider', {request : type, args : data}, this.response);
	}
	
	this.response = function(data) {
		if(debug)
			chat.displayDebugMessage('Response dump: <br />' + JSON.stringify(data) + '</p>');
		
		switch(data.response) {
			case responseType.CLOSED:
				chat.displayInfoMessage(data.args.message);
				break;
			case responseType.MESSAGES:
				chat.messagesReceived(data.args);
				timer = window.setTimeout("chat.fetchMessages()", poolInterval);
				break;
			case responseType.NO_NEW_MESSAGES:
				timer = window.setTimeout("chat.fetchMessages()", poolInterval);
				break;
			case responseType.POST_SUCCESS:
				break;
			case responseType.SIGN_IN_SUCCESS:
				chat.displayInfoMessage(text.welcome_pre + $.trim($('#nicknameInput').attr('value')) + text.welcome_post);
				chat.enableChat(data);
				break;
			case responseType.SIGN_IN_USERNAME_TAKEN:
				chat.displayErrorMessage(text.userNameTaken);
				break;
			case responseType.SIGN_OUT_SUCCESS:
				debug = false;
				chat.displayInfoMessage(text.signOutSuccess);
				chat.disableChat(data);
				break;
			case responseType.UNSIGNED_IN:
				if(data.args.messages != null)
					chat.messagesReceived(data.args.messages);
				else 
					lastFetchId = data.args.initid;
				
				timer = window.setTimeout("chat.fetchMessages()", poolInterval);
				
				chat.displayInfoMessage(text.pleaseSignIn);
				chat.enableSignIn();
				break;
			case responseType.RECONNECT_SUCCESS:
				chat.reconnect(data);
				break;
		}
	}

//----------------------------------------
// Chat enable / disable
//----------------------------------------
	
	this.enableSignIn = function() {
		$('#signInPanel').show();
		
	}
	
	this.enableChat = function(data) {
		user = {name : data.args.name, token : data.args.token};
		
		$('#signInPanel').hide();
		$('#messageInputPanel').show();
		$('#chatName').text(user.name);
	}
	
	this.disableChat = function(data) {
		user = null;
		
		$('#signInPanel').show();
		$('#messageInputPanel').hide();
		$('#chatName').empty();
		$('#nicknameInput').attr('value', '');
	}

//----------------------------------------
// Display messages
//----------------------------------------
	
	this.displayChatMessage = function(id, name, message) {
		chat.displayMessage('<p id="msg_' + id + '" class="chatMessage"><b>'+ name +': </b>' + message + '</p>');
	}
	
	this.displayDebugMessage = function(message) {
		chat.displayMessage('<p class="chatDebug"><b>DEBUG:</b> ' + message + '</p>');
	}
	
	this.displayInfoMessage = function(message) {
		chat.displayMessage('<p class="chatInfo"><b>INFO:</b> ' + message + '</p>');
	}
	
	this.displayErrorMessage = function(message) {
		chat.displayMessage('<p class="chatError"><b>ERROR:</b> ' + message + '</p>');
	}
	
	this.displayMessage = function(message) {
		$('#window').append(message);
		
		// Scroll to bottom of the content
				
		$("#window").each( function() 
		{
		   var scrollHeight = Math.max(this.scrollHeight, this.clientHeight);
		   this.scrollTop = scrollHeight - this.clientHeight;
		});
	}
	
	return true;
}
