var serverCall;
var fun;
(function($) {
	$.liveChat = function(login, options, events) {
		var settings = {
				outputDiv: '#innerWrapper',
				displayDiv: '.chatwin',
				inputArea: '#message',
				chatroom: 0,
				sendBtn: "#send",
				videoArea: ".wcam",
				identity: { nickname: 'Guest' }
		};
		
		var incomeEvents = {
				cmdAddText: function(params, event) {
					if (event.source !== settings.identity.nickname) {
						printText(params, 'output', event.source);
					}
					else {
						printText(params, 'input', event.source);
					}
				},
				cmdSetDisplay: function(params, event) {
					setDisplay(params);
				}
		};
		
		if (options) {
			$.extend(settings, options);
		}
		
		if (events) {
			$.extend(incomEvents, events);
		}
		
		var inputBox = $(settings.inputArea);
		var button = $(settings.sendBtn);
		var outputBox = $(settings.outputDiv);
		var displayBox = $(settings.displayDiv);
		
		function sendText() {
			var text = inputBox.val().replace(/&/g, "&amp;")
									 .replace(/</g, "&lt;")
									 .replace(/>/g, "&gt;");
			
			if (text==="") return false;
			
			serverCall.sync.addMessage("AddText", text);
			printText(text);
		}
		
		function printText(text, type, source) {			
			var className = type=='input'?'you':'other';
			var elm = $('<p class="'+className+'"><span class="'+className+'">' + 
						       (source?source:settings.identity.nickname) 
					        + ':</span> ' + text + '</p>');
			outputBox.append(elm);
			var attr = outputBox.attr('scrollHeight');
			var cscroll = outputBox.attr('scrollTop');
			outputBox.attr('scrollTop', attr);			
		}
		
		function setDisplay(html) {
			displayBox.html(html);
		}
		
		function handleInput(event) {
			if (event.keyCode === 13) {
				sendText();
				inputBox.val("");
				return false;
			}
			$(button).click(function() {
				sendText();
				inputBox.val("");
				return false;
			});
		}
		
		function processCommands(commands) {
			for (var i in commands) {
				var command = commands[i];
				var execute = 'cmd' + command.command;
				if (incomeEvents[execute])  
					incomeEvents[execute](command.params, command);
				else {
					alert('Event ' + execute + ' does not exist.');
					return;
				}
			}
		}
		
		function pollMessages() {
			//var commands = serverCall.getUnreadMessages();
			//processCommands(commands);
			//setTimeout(pollMessages, 5000);
			//serverCall.pollIncomingData();
			//pollMessages();
			serverCall.async.pollIncomingData(function(params){
				processCommands(params);
				pollMessages();
			});
		}
		
		/* Bind Events */
		setDisplay($('<img src="/imgs/defaultchat.jpg" />'));
		serverCall = $.Zend.jsonrpc({url: '../../../../process.php'});
		
		/* Init JSON Rpc */
		inputBox.keypress(handleInput);
		if (login === true) {
			serverCall.sync.login(settings.chatroom, settings.identity.nickname);
		}
		var commands = serverCall.sync.getAllMessages();
		processCommands(commands);	
		pollMessages();
	};
})(jQuery);
