define(['taskbar'], function(taskbar) { var module = {}; module.bringModalToTop = function(chatModal) { var topZ = 0; $('.modal').each(function() { var thisZ = parseInt($(this).css('zIndex'), 10); if (thisZ > topZ) { topZ = thisZ; } }); chatModal.css('zIndex', topZ + 1); } module.getModal = function(touid) { return $('#chat-modal-' + touid); } module.modalExists = function(touid) { return $('#chat-modal-' + touid).length !== 0; } function checkStatus(chatModal, callback) { socket.emit('api:user.isOnline', chatModal.touid, function(data) { if(data.online !== chatModal.online) { if(data.online) { module.appendChatMessage(chatModal, chatModal.username + ' has come online.\n', data.timestamp); } else { module.appendChatMessage(chatModal, chatModal.username + ' has gone offline.\n', data.timestamp); } chatModal.online = data.online; } if(callback) callback(data.online); }); } function checkOnlineStatus(chatModal) { if(chatModal.intervalId === 0) { chatModal.intervalId = setInterval(function(){ checkStatus(chatModal); }, 1000); } } module.createModal = function(username, touid, callback) { var chatModal = $('#chat-modal').clone(), uuid = utils.generateUUID(); chatModal.intervalId = 0; chatModal.touid = touid; chatModal.username = username; chatModal.attr('id', 'chat-modal-' + touid); chatModal.attr('UUID', uuid); chatModal.appendTo($('body')); chatModal.draggable({ start:function() { module.bringModalToTop(chatModal); } }); chatModal.find('#chat-with-name').html(username); chatModal.find('.close').on('click', function(e) { clearInterval(chatModal.intervalId); chatModal.intervalId = 0; chatModal.hide(); taskbar.discard('chat', uuid); }); chatModal.on('click', function(e) { module.bringModalToTop(chatModal); }); addSendHandler(chatModal); checkStatus(chatModal, function(online) { chatModal.online = online; getChatMessages(chatModal, function() { checkOnlineStatus(chatModal); }); }); taskbar.push('chat', chatModal.attr('UUID'), {title:'chat with ' + username}); return chatModal; } module.load = function(uuid) { var chatModal = $('div[UUID="'+uuid+'"]'); chatModal.show(); module.bringModalToTop(chatModal); checkOnlineStatus(chatModal); } module.minimize = function(uuid) { var chatModal = $('div[UUID="'+uuid+'"]'); chatModal.hide(); taskbar.minimize('chat', uuid); clearInterval(chatModal.intervalId); chatModal.intervalId = 0; } function getChatMessages(chatModal, callback) { socket.emit('getChatMessages', {touid:chatModal.touid}, function(messages) { for(var i = 0; i<messages.length; ++i) { module.appendChatMessage(chatModal, messages[i].content, messages[i].timestamp); } callback(); }); } function addSendHandler(chatModal) { chatModal.find('#chat-message-input').off('keypress'); chatModal.find('#chat-message-input').on('keypress', function(e) { if(e.which === 13) { sendMessage(chatModal); } }); chatModal.find('#chat-message-send-btn').off('click'); chatModal.find('#chat-message-send-btn').on('click', function(e){ sendMessage(chatModal); return false; }); } function sendMessage(chatModal) { var msg = app.strip_tags(chatModal.find('#chat-message-input').val()); if(msg.length) { msg = msg +'\n'; socket.emit('sendChatMessage', { touid:chatModal.touid, message:msg}); chatModal.find('#chat-message-input').val(''); } } module.appendChatMessage = function(chatModal, message, timestamp) { var chatContent = chatModal.find('#chat-content'); var date = new Date(parseInt(timestamp, 10)); chatContent.append('[' + date.toLocaleTimeString() + '] ' + message); chatContent.scrollTop( chatContent[0].scrollHeight - chatContent.height() ); } return module; });