//Make sure prototype.js is loaded first!

//MessageType enum
function MessageType(name) { this._name = name; }
MessageType.prototype.toString = function () { return this._name; };
MessageType.CLI_WordSubmit	 				= 1;
MessageType.CLI_ChatSubmit 					= 2;
MessageType.CLI_UserLeave 					= 3;
MessageType.CLI_ContinuePlay 				= 4;
MessageType.SRV_0Words 							= 5;
MessageType.SRV_1Word 							= 6;
MessageType.SRV_2Words 							= 7;
MessageType.SRV_Victory			 				= 8;						
MessageType.SRV_UserLeft		 				= 9;
MessageType.SRV_UserJoined	 				= 10;
MessageType.SRV_ChatSent		 				= 11;
MessageType.CLI_UserHandleChange 		= 12;
MessageType.SRV_UserHandleChanged 	= 13;
MessageType.SRV_WordTooLate 				= 14;
MessageType.SRV_PlayersInRoom 			= 15;
MessageType.CLI_RoomEntry						= 16;

//Hold all our messages we have yet to send
var MESSAGES_QUEUE = new Array();
var LAST_MESSAGE_ID = 0;

function AddMessageToQueue(message_type, data) {
	SendWithoutQueue(message_type, data, null);

	return;
	//disabling queue
	var message = { message_type_id: message_type, data: data };			
	MESSAGES_QUEUE.push(message);
}

function SyncMessages() {
	var data = Object.toJSON(MESSAGES_QUEUE);
	var url = '/room/sync_messages';
	var params = {
		authenticity_token: AUTH_TOKEN,
		messages: '[]',
		//messages: Object.toJSON(MESSAGES_QUEUE),
		last_message_id: LAST_MESSAGE_ID };

	new Ajax.Request(url, {
	  method: 'post',
		parameters: params,
	  onSuccess: HandleMessages });		
}

function SendWithoutQueue(message_type, data, onSuccess) {
	var fake_queue = new Array();
	var message = { message_type_id: message_type, data: data };			
	fake_queue.push(message);

	var data = Object.toJSON(fake_queue);
	var url = '/room/sync_messages';
	var params = {
		authenticity_token: AUTH_TOKEN,
		messages: Object.toJSON(fake_queue),
		last_message_id: LAST_MESSAGE_ID };

	new Ajax.Request(url, {
	  method: 'post',
		parameters: params,
	  onSuccess: onSuccess });			
}

function HandleMessages(transport) {
	//clear msg queue
	MESSAGES_QUEUE = new Array(); //TODO: fix case where users may enter new messages during request...

	//handle each message appropriately
	var messages = transport.responseJSON;	
	messages.each(function(item) {
		var message = item.message; //each message object comes over the wire keyed to message like {"message" => #the real msg in ruby}
		switch(message.message_type_id) {
			case MessageType.SRV_ChatSent:
				Handle_SRV_ChatSent(message);
				break;

			case MessageType.SRV_0Words:
				Handle_SRV_0Words(message);
				break;

			case MessageType.SRV_1Word:
				Handle_SRV_1Word(message);
				break;

			case MessageType.SRV_2Words:
				Handle_SRV_2Words(message);
				break;
			
			case MessageType.SRV_Victory:
				Handle_SRV_Victory(message);
				break;

			case MessageType.SRV_UserLeft:
				Handle_SRV_UserLeft(message);
				break;

			case MessageType.SRV_UserJoined:
				Handle_SRV_UserJoined(message);
				break;
				
			case MessageType.SRV_UserHandleChanged:
				Handle_SRV_UserHandleChanged(message);
				break;

			case MessageType.SRV_PlayersInRoom:
				Handle_SRV_UserJoined(message);
				break;

			default:
				//if we can't find an appropriate msg type, ignore the message
				break;
		}		
	});
	
	//update last message seen
	if (messages.length > 0) {
		var last_message = messages.toArray().last().message;
		if (last_message.id != null) {
			LAST_MESSAGE_ID = last_message.id;
		}
	}			
}

// Make our first call to init the room state
SendWithoutQueue(MessageType.CLI_RoomEntry, '', HandleMessages)

// Sync Messages every second
SyncMessages(); //start first on load
var message_syncer = new PeriodicalExecuter(SyncMessages, 3);
