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 {