Index: lams_learning/web/includes/presence.js =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/includes/Attic/presence.js,v diff -u -r1.7 -r1.7.2.1 --- lams_learning/web/includes/presence.js 1 Apr 2009 00:44:36 -0000 1.7 +++ lams_learning/web/includes/presence.js 17 Apr 2009 08:22:31 -0000 1.7.2.1 @@ -11,22 +11,47 @@ var tabLabelsLocal = null; var windowHeight; var presenceShown = false; +var showStatus = false; /* ******* HTML writer functions ******* */ function createPrivateTabLabel(label, tag){ - return '
' + label + '
'; + return '' + + '' + + '' + + '' + + '' + + '' + + '
' + label + '
'; } function createPrivateTabContent(label, tag){ - return '

'; + return '

' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '
' + + '
' + + '
'; } function createPresenceListing(nick, tag){ - return '
' + nick + '
'; + return '' + + '' + + '' + + '' + + '' + + '
' + nick + '
'; } function createContextMenu(tag){ - return ''; + return ''; } /* ******* Helper Functions ******* */ @@ -89,6 +114,8 @@ $("#" + tag).attr("style", "width: 95%; height: 80%;"); // add the content $("#" + tag).html(createPrivateTabContent(nick, tag)); + + $.get(lamsUrl + "PresenceChatLogger.do", {method: "getConversationHistory", roomName:CONFERENCEROOM, from:NICK, to:nick}, handleGetConversation); } function htmlEnc(str) { @@ -116,9 +143,37 @@ } function nickToMessageArea(nick){ - return nick.replace(/ /g, "_") + '_messageArea'; + return tagToMessageArea(nickToTag(nick)); } +function tagToMessageArea(tag){ + return tag + '_messageArea'; +} + +function nickToListing(nick){ + return tagToListing(nickToTag(nick)); +} + +function tagToListing(tag){ + return tag + '_listing'; +} + +function nickToListingImage(nick){ + return tagToListingImage(nickToTag(nick)); +} + +function tagToListingImage(tag){ + return tag + '_listingImage'; +} + +function nickToContentMenu(nick){ + return tagToContextMenu(nickToTag(nick)); +} + +function tagToContextMenu(tag){ + return tag + '_contextMenu'; +} + function getRosterUserByNick(nick) { for (var i = 0; i < this.users.length; i++) { if (this.users[i].nick == nick) { @@ -138,12 +193,20 @@ } function sortFunction(a, b){ - if (a.nick < b.nick){ + if(a.status < b.status){ return -1; } - if (a.nick > b.nick){ + else if(a.status > b.status){ return 1; } + else{ + if (a.nick < b.nick){ + return -1; + } + if (a.nick > b.nick){ + return 1; + } + } return 0; } @@ -165,6 +228,10 @@ return "(" + hours + ":" + minutes + ":" + seconds + ")"; } +function trimTime(time){ + return "(" + time.substring(11, 19) + ")"; +} + function createElem(name, attrs, style, innerHTML) { var e = document.createElement(name); if (attrs) { @@ -217,7 +284,7 @@ return !blocked; } -function addContextMenu(div, contextMenu){ +function connectUserContextMenu(div, contextMenu){ var myDiv = $("#" + div); myDiv.contextMenu({ menu: contextMenu @@ -265,17 +332,15 @@ else if(document.getElementById(tag) == null){ // add a tab addTab(nick, tag); - // select the added tab - $("#presenceChatTabs").tabs('select' , tag); } // if the clicked user's tab is open else{ // make the sender's tab label unbold $('#' + tag + '_tabLabel').html(nick); - - // select the tab - $("#presenceChatTabs").tabs('select' , tag); } + + // select the added tab + $("#presenceChatTabs").tabs('select' , tag); } function handleCloseTabClick(label){ @@ -290,10 +355,12 @@ function handlePresenceClick() { if(presenceShown){ $("#presenceChat").animate({top: windowHeight + "px"}, 1000 ); + $("#minMaxIcon").attr("src", "../images/icons/bullet_arrow_top.png") presenceShown = false; } else{ $("#presenceChat").animate({top: windowHeight - 270 + "px"}, 1000 ); + $("#minMaxIcon").attr("src", "../images/icons/bullet_arrow_bottom.png"); presenceShown = true; } } @@ -325,69 +392,89 @@ function UpdateRosterDisplay() { // sort users by name this.users.sort(sortFunction); + + // reset the count var availableCount = 0; - // get number available users (sorry) - for (var i = 0; i < this.users.length; i++) { - if (this.users[i].status != "unavailable") { - availableCount++; - } - } - - // update presenceTabLabel - var presenceTabLabelDiv = $("#presence_tabLabel"); - presenceTabLabelDiv.html("Users (" + availableCount + ")"); - - // update users in presence tab // get rosterDiv var rosterDiv = $("#presenceUserListings"); - // clear rosterDiv - rosterDiv.html(""); - + // if presence im is enabled if(presenceImEnabled == "true"){ // get rosterDiv var contextMenus = $("#presenceContextMenus"); - // clear rosterDiv - contextMenus.html(""); } // for all users for (var i = 0; i < this.users.length; i++) { - // if available - if (this.users[i].status != "unavailable") { - // get nick - var nick = this.users[i].nick; - // get tag - var tag = this.users[i].tag; - // get blocked - var blocked = this.users[i].blocked; - - // create listing div name - var listingName = tag + "_listing"; + // get available + var available = this.users[i].status; + // get nick + var nick = this.users[i].nick; + // get tag + var tag = this.users[i].tag; + // get blocked + var blocked = this.users[i].blocked; + + // get listing name + var listingName = tagToListing(tag); + + // get the actual listing + var listing = $("#" + listingName); + + // if no listing exists + if(listing.length == 0){ // create listing div // note: attrId must be added to array before onClick var listingDiv = createElem("div", {attrId:listingName, rosterIndex:i, onClick:"handlePresenceLeftClick('" + listingName + "');", attrClass:"presenceName"}, {}, createPresenceListing(nick, tag)); + // add the listing div rosterDiv.append(listingDiv); // if presence im is enabled if(presenceImEnabled == "true"){ // if not oneself if(nick != NICK){ - // create context menu div name - var contextMenuName = tag + "_contextMenu"; // add the context menu contextMenus.html(contextMenus.html() + createContextMenu(tag)); - // connect the context menu to the last added div - addContextMenu(listingName, contextMenuName); - // refresh the context menu - refreshContextMenu(tag, blocked); } } - } + else{ + // remove and append at the right place (from sort) + rosterDiv.append(listing.remove()); + + // refresh roster index + listing.attr("rosterindex", i); + } + + // get context menu div name + var contextMenuName = tagToContextMenu(tag); + + /* + connect the context menu to the last added div + when listings are moved events are scrapped... must reconnect them each time + */ + connectUserContextMenu(listingName, contextMenuName); + + // refresh the context menu + refreshContextMenu(tag, blocked); + + // get the listingImage + var listingImage = $("#" + tagToListingImage(tag)); + + // set the correct icon depending on status + if(available == "available"){ + availableCount++; + listingImage.attr("src", "../images/icons/user_online.png"); + }else{ + listingImage.attr("src", "../images/icons/user_offline.png"); + } } + + // update presenceTabLabel + var presenceTabLabelDiv = $("#presence_tabLabel"); + presenceTabLabelDiv.html("Users (" + availableCount + ")"); } function Roster() { @@ -409,8 +496,15 @@ document.forms[0].msg.focus(); } -function generateMessageHTML(nick, message) { - var fromElem = createElem("div", {attrClass:"presenceMessageFrom"}, null, getTime() + " " + nick); +function generateMessageHTML(nick, message, date) { + var fromElem; + + if(!date){ + fromElem = createElem("div", {attrClass:"presenceMessageFrom"}, null, getTime() + " " + nick); + }else{ + fromElem = createElem("div", {attrClass:"presenceMessageFrom"}, null, trimTime(date) + " " + nick); + } + var msgElem = createElem("div", {attrClass:"presenceMessage"}, null, message); msgElem.insertBefore(fromElem, msgElem.firstChild); return msgElem; @@ -452,19 +546,19 @@ // since the jabber server will not echo sent private messages. // TODO: need to check if this is correct behaviour if (!(NICK == toNick)) { - updateMessageDisplay(nickToMessageArea(toNick), generateMessageHTML(NICK, aForm.messageInput.value)); + updateMessageDisplay(nickToMessageArea(toNick), generateMessageHTML(NICK, aForm.messageInput.value, null)); } // log message - $.get(lamsUrl + "PresenceChatLogger", {roomName:CONFERENCEROOM, from:NICK, to:toNick, dateSent:new Date(), message:aForm.messageInput.value}, null); + $.get(lamsUrl + "PresenceChatLogger.do", {method: "saveMessage", roomName:CONFERENCEROOM, from:NICK, to:toNick, dateSent:new Date(), message:aForm.messageInput.value}, null); } // otherwise, it's a group chat message else { aMsg.setTo(CONFERENCEROOM); aMsg.setType("groupchat"); aMsg.setBody(aForm.messageInput.value); - $.get(lamsUrl + "PresenceChatLogger", {roomName:CONFERENCEROOM, from:NICK, to:null, dateSent:new Date(), message:aForm.messageInput.value}, null); + $.get(lamsUrl + "PresenceChatLogger.do", {method: "saveMessage", roomName:CONFERENCEROOM, from:NICK, to:null, dateSent:new Date(), message:aForm.messageInput.value}, null); } aMsg.setFrom(USERNAME + "@" + XMPPDOMAIN + "/" + RESOURCE); @@ -527,10 +621,11 @@ if(getUserFromTabIndex(selected).tag != tag){ // make the sender's tab label bold $('#' + tag + '_tabLabel').html('' + nick + ''); + $("#presenceChatTabs").tabs('_tabify', false); } // generate html - htmlMessage = generateMessageHTML(nick, message); + htmlMessage = generateMessageHTML(nick, message, null); // add the div to the sender's tab updateMessageDisplay(nickToMessageArea(nick), htmlMessage); @@ -546,9 +641,10 @@ if(selected != 0){ // make the group chat label label bold $('#groupchat_tabLabel').html('Group Chat'); + $("#presenceChatTabs").tabs('_tabify', false); } - htmlMessage = generateMessageHTML(nick, message); + htmlMessage = generateMessageHTML(nick, message, null); updateMessageDisplay('groupchat_messageArea', htmlMessage); } else { // somethings wrong, dont add anything @@ -601,75 +697,56 @@ if (type == "unavailable") { // set unavailable status user.status = "unavailable"; - - // if presence im is enabled (there is a chatbox) - if(presenceImEnabled == "true"){ - // get the selected tab - var selected = $("#presenceChatTabs").tabs().data('selected.tabs'); - - // if the selected tab is any other than groupchat - if(selected != 0){ - // make the group chat label bold - $('#groupchat_tabLabel').html('Group Chat'); - } - - // generate the emote message and display it to group chat - var emoteMessage = generateEmoteHTML(nick, "has gone offline"); - updateMessageDisplay('groupchat_messageArea', emoteMessage); - - // if the person who got disconnected has a tab open - if(document.getElementById(nickToMessageArea(nick)) != null){ - // get the selected tab - var selected = $("#presenceChatTabs").tabs().data('selected.tabs'); - - // if the selected tab is any other than sender's tab - if(getUserFromTabIndex(selected).tag != tag){ - // make the sender's tab label bold - $('#' + tag + '_tabLabel').html('' + nick + ''); - } - - // generate the emote message and display it to group chat - var emoteMessage = generateEmoteHTML(nick, "has gone offline"); - updateMessageDisplay(nickToMessageArea(nick), emoteMessage); - } - } } } // default: means presence is available else { // set status to available user.status = "available"; + } + } + + // if presence im is enabled (there is a chatbox) + if(presenceImEnabled == "true"){ + // get the selected tab + var selected = $("#presenceChatTabs").tabs().data('selected.tabs'); + + if(showStatus){ + // if the selected tab is any other than groupchat + if(selected != 0){ + // make the group chat label bold + $('#groupchat_tabLabel').html('Group Chat'); + } - // if presence im is enabled (there is a chatbox) - if(presenceImEnabled == "true"){ - // get the selected tab - var selected = $("#presenceChatTabs").tabs().data('selected.tabs'); + // generate the emote message and display it to group chat + var emoteMessage; + if(user.status == "unavailable"){ + emoteMessage = generateEmoteHTML(nick, "has gone offline"); + } + else if(user.status == "available"){ + emoteMessage = generateEmoteHTML(nick, "has come online"); + } + updateMessageDisplay('groupchat_messageArea', emoteMessage); + } - // if the selected tab is any other than groupchat - if(selected != 0){ - // make the group chat label label bold - $('#groupchat_tabLabel').html('Group Chat'); + // if the person who got disconnected has a tab open + if(document.getElementById(nickToMessageArea(nick)) != null){ + // if the selected tab is any other than sender's tab + if(getUserFromTabIndex(selected).tag != tag){ + // make the sender's tab label bold + $('#' + tag + '_tabLabel').html('' + nick + ''); + } + + if(showStatus){ + // generate the emote message and display it to private chat + var emoteMessage; + if(user.status == "unavailable"){ + emoteMessage = generateEmoteHTML(nick, "has gone offline"); } - - // generate the emote message and display it to group chat - var emoteMessage = generateEmoteHTML(nick, "has come online"); - updateMessageDisplay('groupchat_messageArea', emoteMessage); - - // if the person who got connected has a tab open - if(document.getElementById(nickToMessageArea(nick)) != null){ - // get the selected tab - var selected = $("#presenceChatTabs").tabs().data('selected.tabs'); - - // if the selected tab is any other than sender's tab - if(getUserFromTabIndex(selected).tag != tag){ - // make the sender's tab label bold - $('#' + tag + '_tabLabel').html('' + nick + ''); - } - - // generate the emote message and display it to group chat - var emoteMessage = generateEmoteHTML(nick, "has come online"); - updateMessageDisplay(nickToMessageArea(nick), emoteMessage); + else if(user.status == "available"){ + emoteMessage = generateEmoteHTML(nick, "has come online"); } + updateMessageDisplay(nickToMessageArea(nick), emoteMessage); } } } @@ -680,7 +757,7 @@ function handleConnected() { // if presence im is enabled (there is a chatbox) - if(presenceImEnabled == "true"){ + if(presenceImEnabled == "true" && showStatus){ // generate the emote message and display it to group chat var emoteMessage = generateEmoteHTML("You", "have been connected to LAMS instant messaging"); updateMessageDisplay('groupchat_messageArea', emoteMessage); @@ -698,11 +775,14 @@ // set up roster roster = new Roster(); + + // get group chat history + $.get(lamsUrl + "PresenceChatLogger.do", {method: "getGroupHistory", roomName:CONFERENCEROOM}, handleGetGroupHistory); } function handleDisconnected() { // if presence im is enabled (there is a chatbox) - if(presenceImEnabled == "true"){ + if(presenceImEnabled == "true" && showStatus){ // generate the emote message and display it to group chat var emoteMessage = generateEmoteHTML("You", "have been disconnected from LAMS instant messaging"); updateMessageDisplay('groupchat_messageArea', emoteMessage); @@ -725,7 +805,36 @@ doLogin(presenceUrl, userId, userId, userId, roomName, nickname, false); } } - + +function handleGetGroupHistory(groupHistory){ + if(groupHistory){ + $(groupHistory).find("clause").each(function() { + var from = $(this).find('from').text(); + var dateSent = $(this).find('dateSent').text(); + var message = $(this).find('message').text(); + var htmlMessage = generateMessageHTML(from, message, dateSent); + updateMessageDisplay('groupchat_messageArea', htmlMessage); + }); + } +} + +function handleGetConversation(conversation){ + if(conversation) { + var nick = $(conversation).find('nick').text(); + $(conversation).find("clause").each(function() { + var from = $(this).find('from').text(); + var to = $(this).find('to').text(); + var dateSent = $(this).find('dateSent').text(); + var message = $(this).find('message').text(); + + var htmlMessage = generateMessageHTML(from, message, dateSent); + + // add the div to the sender's tab + updateMessageDisplay(nickToMessageArea(nick), htmlMessage); + }); + } +} + /* ******* Connection function ******* */ function doLogin(presenceServerUrl, userID, password, resource, chatroom, nickname, register) { try {