Index: lams_learning/web/includes/presence.js
===================================================================
RCS file: /usr/local/cvsroot/lams_learning/web/includes/Attic/presence.js,v
diff -u -r1.6 -r1.7
--- lams_learning/web/includes/presence.js 27 Nov 2008 22:45:03 -0000 1.6
+++ lams_learning/web/includes/presence.js 1 Apr 2009 00:44:36 -0000 1.7
@@ -1,24 +1,96 @@
-
-/* ******* Constants ******* */
-var GROUPCHAT_MSG = "";
-var PRIVATE_MSG = "private_message";
-var PALETTE = ["#0000FF", "#006699", "#0066FF", "#6633FF", "#00CCFF", "#009900", "#00CC33", "#339900", "#008080", "#66FF66", "#CC6600", "#FF6600", "#FF9900", "#CC6633", "#FF9933", "#990000", "#A50021", "#990033", "#CC3300", "#FF6666", "#330033", "#663399", "#6633CC", "#660099", "#FF00FF", "#999900", "#808000", "#FF9FF2", "#666633", "#292929", "#666666"];
-/* ******* Connection variables ******* */
+/******** Connection variables ******* */
var CONFERENCEROOM = "";
var XMPPDOMAIN = "";
var USERNAME = "";
var PASSWORD = "";
var NICK = "";
var RESOURCE = "";
-var FROMFLASH;
+
+/******** Other variables ******* */
+var groupChatInfo = {nick:"Group Chat", tag:"groupchat", blocked:false};
+var tabLabelsLocal = null;
+var windowHeight;
+var presenceShown = false;
+
+/* ******* HTML writer functions ******* */
+function createPrivateTabLabel(label, tag){
+ return '
 | ' + label + ' | |
';
+}
+
+function createPrivateTabContent(label, tag){
+ return '
';
+}
+
+function createPresenceListing(nick, tag){
+ return ' | ' + nick + ' |
';
+}
+
+function createContextMenu(tag){
+ return '';
+}
+
/* ******* Helper Functions ******* */
-function getColour(nick) {
- var charSum = 0;
- for (var i = 0; i < nick.length; i++) {
- charSum += nick.charCodeAt(i);
+// resizes chat window
+function resizeChat(){
+ // refresh the window height
+ windowHeight = $(window).height() - 30;
+
+ // if presence is shown
+ if(presenceShown){
+ // set presence chat to maximized height
+ $("#presenceChat").css({'top': windowHeight - 270 + "px"});
}
- return PALETTE[charSum % (PALETTE.length)];
+ // otherwise
+ else{
+ // set presence chat to minimized height
+ $("#presenceChat").css({'top': windowHeight + "px"});
+ }
}
+
+function getUserFromTag(tag){
+ if(tag == groupChatInfo.tag){
+ return groupChatInfo;
+ }
+ else{
+ for(var i = 0; i < roster.users.length; i++){
+ if(roster.users[i].tag == tag){
+ return roster.users[i];
+ }
+ }
+ }
+
+ return null;
+}
+
+function getUserFromLabel(label){
+ if(label == groupChatInfo.nick){
+ return groupChatInfo;
+ }
+ else{
+ for(var i = 0; i < roster.users.length; i++){
+ if(roster.users[i].nick == label){
+ return roster.users[i];
+ }
+ }
+ }
+
+ return null;
+}
+
+function getUserFromTabIndex(tabIndex){
+ tabLabelsLocal = $(".ui-tabs-label");
+ return getUserFromLabel(tabLabelsLocal[tabIndex].innerHTML);
+}
+
+function addTab(nick, tag){
+ // add a tab with the the nick specified
+ $("#presenceChatTabs").tabs('add' , '#' + tag, createPrivateTabLabel(nick, tag));
+ // correct the holding div
+ $("#" + tag).attr("style", "width: 95%; height: 80%;");
+ // add the content
+ $("#" + tag).html(createPrivateTabContent(nick, tag));
+}
+
function htmlEnc(str) {
if (!str) {
return null;
@@ -31,50 +103,6 @@
return str;
}
-function correctPresenceName(o){
- var s = o.nick;
- var newNick = new String("");
- for (var i = 0; i < s.length; i++) {
- var char = s.charCodeAt(i);
- if (char >= 192 && char <= 197)
- newNick += "A";
- else if (char == 199)
- newNick += "C";
- else if (char >= 200 && char <= 203)
- newNick += "E";
- else if (char >= 204 && char <= 207)
- newNick += "I";
- else if (char == 209)
- newNick += "N";
- else if ((char >= 210 && char <= 214) || char == 216)
- newNick += "O";
- else if (char >= 217 && char <= 220)
- newNick += "U";
- else if (char == 221)
- newNick += "Y";
- else if (char >= 224 && char <= 229)
- newNick += "a";
- else if (char == 231)
- newNick += "c";
- else if (char >= 232 && char <= 235)
- newNick += "e";
- else if (char >= 236 && char <= 239)
- newNick += "i";
- else if (char == 241)
- newNick += "n";
- else if ((char >= 242 && char <= 246) || char == 240 || char == 248)
- newNick += "o";
- else if (char >= 249 && char <= 252)
- newNick += "u";
- else if (char == 253 || char == 255)
- newNick += "y";
- else
- newNick += s.charAt(i);
- }
-
- o.nick = newNick;
- return o;
-}
function correctPresenceRoomName(s){
s = s.replace(/ /g, "_");
@@ -83,7 +111,61 @@
return s;
}
-function createElem(name, attrs, style, text) {
+function nickToTag(nick){
+ return nick.replace(/ /g, "_");
+}
+
+function nickToMessageArea(nick){
+ return nick.replace(/ /g, "_") + '_messageArea';
+}
+
+function getRosterUserByNick(nick) {
+ for (var i = 0; i < this.users.length; i++) {
+ if (this.users[i].nick == nick) {
+ return this.users[i];
+ }
+ }
+ return null;
+}
+
+function getRosterIndexByNick(nick) {
+ for (var i = 0; i < this.users.length; i++) {
+ if (this.users[i].nick == nick) {
+ return this.users[i];
+ }
+ }
+ return null;
+}
+
+function sortFunction(a, b){
+ if (a.nick < b.nick){
+ return -1;
+ }
+ if (a.nick > b.nick){
+ return 1;
+ }
+
+ return 0;
+}
+
+function getTime(){
+ var currentTime = new Date();
+ var hours = currentTime.getHours();
+ var minutes = currentTime.getMinutes();
+ var seconds = currentTime.getSeconds();
+
+ if (minutes < 10){
+ minutes = "0" + minutes;
+ }
+
+ if (seconds < 10){
+ seconds = "0" + seconds;
+ }
+
+ return "(" + hours + ":" + minutes + ":" + seconds + ")";
+}
+
+function createElem(name, attrs, style, innerHTML) {
var e = document.createElement(name);
if (attrs) {
for (var key in attrs) {
@@ -93,7 +175,14 @@
if (key == "attrId") {
e.id = attrs[key];
} else {
- e.setAttribute(key, attrs[key]);
+ if(key == "onClick"){
+ // for IE (attrId must have been set to e.id)
+ e.onclick = function() {handlePresenceLeftClick(e.id);};
+ // for FF
+ e.setAttribute(key, attrs[key]);
+ } else {
+ e.setAttribute(key, attrs[key]);
+ }
}
}
}
@@ -103,93 +192,204 @@
e.style[key] = style[key];
}
}
- if (text) {
- e.appendChild(document.createTextNode(text));
+ if (innerHTML) {
+ //e.appendChild(document.createTextNode(text));
+ e.innerHTML = innerHTML;
}
return e;
}
+function refreshContextMenu(tag, blocked){
+ var contextMenu = $('#' + tag + '_contextMenu');
+
+ if(blocked){
+ contextMenu.enableContextMenuItems('#allow');
+ contextMenu.disableContextMenuItems('#block');
+ }
+ else{
+ contextMenu.enableContextMenuItems('#block');
+ contextMenu.disableContextMenuItems('#allow');
+ }
+}
+
+function handleAllowBlockClick(tag, blocked){
+ refreshContextMenu(tag, !blocked);
+ return !blocked;
+}
+
+function addContextMenu(div, contextMenu){
+ var myDiv = $("#" + div);
+ myDiv.contextMenu({
+ menu: contextMenu
+ },
+ function(action, el, pos) {
+ // get roster index from clicked div
+ var rosterIndex = $(el).attr('rosterIndex');
+
+ // get info
+ var user = roster.users[rosterIndex];
+ var tag = user.tag;
+ var nick = user.nick;
+ var blocked = user.blocked;
+
+ if(action == "allow" && blocked){
+ roster.users[rosterIndex].blocked = handleAllowBlockClick(tag, blocked);
+ }
+ else if(action == "block" && !blocked){
+ roster.users[rosterIndex].blocked = handleAllowBlockClick(tag, blocked);
+ }
+ });
+}
+
+/* ******* Click handlers ******* */
+function handleLeftScrollClick(){
+ $("#presenceChatTabs").tabs('scrollLeft');
+}
+
+function handleRightScrollClick(){
+ $("#presenceChatTabs").tabs('scrollRight');
+}
+
+function handlePresenceLeftClick(divName){
+ var div = document.getElementById(divName);
+ var rosterIndex = div.getAttribute("rosterIndex");
+ var user = roster.users[rosterIndex];
+ var tag = user.tag;
+ var nick = user.nick;
+
+ // if the clicked user is one's self
+ if(nick == NICK){
+ // do nothing
+ }
+ // if the clicked user's tab is not already open, create it and select it
+ 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);
+ }
+}
+
+function handleCloseTabClick(label){
+ tabLabelsLocal = $(".ui-tabs-label");
+ for(var i = 0; i < tabLabelsLocal.length; i++){
+ if(tabLabelsLocal[i].innerHTML == label){
+ $("#presenceChatTabs").tabs('remove' , i);
+ }
+ }
+}
+
+function handlePresenceClick() {
+ if(presenceShown){
+ $("#presenceChat").animate({top: windowHeight + "px"}, 1000 );
+ presenceShown = false;
+ }
+ else{
+ $("#presenceChat").animate({top: windowHeight - 270 + "px"}, 1000 );
+ presenceShown = true;
+ }
+}
+
/* ******* Roster ******* */
function RosterUser(nick) {
this.nick = nick;
+ this.tag = nickToTag(nick);
this.status = "unavailable";
+ this.blocked = false;
+ this.staff = false;
}
-function getRosterUserByNick(nick) {
- for (var i = 0; i < this.users.length; i++) {
- if (this.users[i].nick == nick) {
- return this.users[i];
- }
- }
- return null;
-}
+
function AddRosterUser(user) {
this.users[this.users.length] = user;
}
+
function UpdateRosterUser(user) {
// TODO do we need this.
}
+
function RemoveRosterUser() {
}
-function GetAllRosterUsers() {
+
+function GetAllRosterUsers() {
return this.users;
}
-function CloneAndEncodeUser(user){
- var newUser = new Object();
- var newUserNick;
- newUser.status = "" + user.status;
- newUser.nick = "" + user.nick;
- newUser.nick = encodeURI(newUser.nick);
- return newUser;
-}
-
function UpdateRosterDisplay() {
- if(FROMFLASH){
- // send users to flash
- var availableUsers = [];
-
- for (var i = 0; i < this.users.length; i++) {
- if (this.users[i].status != "unavailable") {
- availableUsers[availableUsers.length] = CloneAndEncodeUser(this.users[i]);
- }
+ // sort users by name
+ this.users.sort(sortFunction);
+ var availableCount = 0;
+
+ // get number available users (sorry)
+ for (var i = 0; i < this.users.length; i++) {
+ if (this.users[i].status != "unavailable") {
+ availableCount++;
}
-
- flashProxy.call("sendUsersToFlash", availableUsers);
}
- else {
- // send roster to no flash version
- var rosterDiv = document.getElementById("roster");
- this.users.sort(sortFunction);
- var availableCount = 0;
-
- // so sorry about this
- 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";
+ // 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);
+ }
}
+
}
-
- var presenceString = presenceLabel + " (" + availableCount + ")";
- rosterDiv.innerHTML = "" + presenceString + "
";
-
- for (var i = 0; i < this.users.length; i++) {
- if (this.users[i].status != "unavailable") {
- var nick = this.users[i].nick;
- var userDiv = createElem("div", {attrId:"user-" + i}, {width:"100%", color:"#0000FF"}, this.users[i].nick);
- rosterDiv.appendChild(userDiv);
- }
- }
}
}
-function sortFunction(a, b){
- if (a.nick < b.nick)
- return -1;
- if (a.nick > b.nick)
- return 1;
- return 0;
-}
-
function Roster() {
this.users = [];
this.currentIndex = null;
@@ -201,114 +401,169 @@
this.updateDisplay = UpdateRosterDisplay;
this.getAllUsers = GetAllRosterUsers;
}
+
var roster = new Roster();
-function selectUser(userDiv) {
- if (MODE == "teacher") {
- var newIndex = userDiv.id.substring(userDiv.id.indexOf("-") + 1, userDiv.id.length);
- if (roster.currentIndex == newIndex) {
- roster.currentIndex = null;
- } else {
- roster.currentIndex = newIndex;
- }
-
- // update "send message to" display
- var sendToUserSpan = document.getElementById("sendToUser");
- var sendToEveryoneSpan = document.getElementById("sendToEveryone");
- if (roster.currentIndex == null) {
- sendToEveryoneSpan.style.display = "inline";
- sendToUserSpan.style.display = "none";
- } else {
- sendToEveryoneSpan.style.display = "none";
- sendToUserSpan.style.display = "inline";
- var nick = roster.users[roster.currentIndex].nick;
- var nickElem = createElem("span", null, {color:getColour(nick)}, nick);
- sendToUserSpan.innerHTML = ""; // clear previous user name
- sendToUserSpan.appendChild(nickElem);
- }
- roster.updateDisplay();
- }
-}
-
/* ******* Chat functions ******* */
function setFocusOnTextarea() {
document.forms[0].msg.focus();
}
-function scrollMessageDisplay() {
- var iRespDiv = document.getElementById("iResp");
- iRespDiv.scrollTop = iRespDiv.scrollHeight;
-}
-function generateMessageHTML(nick, message, type) {
- var colour = getColour(nick);
- var fromElem = createElem("div", {attrClass:"messageFrom"}, null, nick);
- var msgElem = createElem("div", {attrClass:"message " + type}, {color:colour}, null);
- msgElem.innerHTML = message;
+
+function generateMessageHTML(nick, message) {
+ var fromElem = createElem("div", {attrClass:"presenceMessageFrom"}, null, getTime() + " " + nick);
+ var msgElem = createElem("div", {attrClass:"presenceMessage"}, null, message);
msgElem.insertBefore(fromElem, msgElem.firstChild);
return msgElem;
}
-function updateMessageDisplay(htmlMessage) {
- var iRespDiv = document.getElementById("iResp");
- iRespDiv.appendChild(htmlMessage);
- iRespDiv.scrollTop = iRespDiv.scrollHeight;
+
+function generateEmoteHTML(nick, emote){
+ return createElem("div", {attrClass:"presenceMessageEmote"}, null, getTime() + " " + nick + " " + emote);
}
+function updateMessageDisplay(div, htmlMessage) {
+ var messageArea = document.getElementById(div);
+ messageArea.appendChild(htmlMessage);
+ messageArea.scrollTop = messageArea.scrollHeight;
+}
+
function sendMsg(aForm) {
- if (aForm.msg.value === "") {
- return false; // do not send empty messages.
+ // if messageInput in form is empty
+ if (aForm.messageInput.value === "") {
+ // send nothing
+ return false;
}
+
+ // creaet a new message object
var aMsg = new JSJaCMessage();
- if (MODE == "teacher" && !(roster.currentIndex === null)) {
- var toNick = roster.users[roster.currentIndex].nick;
+
+ // prepare nick
+ var toNick = "";
+
+ // prepare user
+ var user = null;
+
+ // if the form has a hidden sendTo input, it's a private message
+ if (aForm.sendTo) {
+ toNick = aForm.sendTo.value;
+ user = roster.getUserByNick(toNick);
aMsg.setTo(CONFERENCEROOM + "/" + toNick);
aMsg.setType("chat");
- var message = "[" + toNick + "] " + aForm.msg.value;
- aMsg.setBody(message);
+ aMsg.setBody(aForm.messageInput.value);
// apending the private message to the incoming window,
// since the jabber server will not echo sent private messages.
// TODO: need to check if this is correct behaviour
if (!(NICK == toNick)) {
- updateMessageDisplay(generateMessageHTML(NICK, message, PRIVATE_MSG));
+ updateMessageDisplay(nickToMessageArea(toNick), generateMessageHTML(NICK, aForm.messageInput.value));
}
- } else {
+
+ // log message
+ $.get(lamsUrl + "PresenceChatLogger", {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.msg.value);
+ aMsg.setBody(aForm.messageInput.value);
+
+ $.get(lamsUrl + "PresenceChatLogger", {roomName:CONFERENCEROOM, from:NICK, to:null, dateSent:new Date(), message:aForm.messageInput.value}, null);
}
-
- // }
+
aMsg.setFrom(USERNAME + "@" + XMPPDOMAIN + "/" + RESOURCE);
- con.send(aMsg);
- aForm.msg.value = "";
+
+ // if groupchat or if user is available
+ if(user == null || user.status == "available"){
+ // send message
+ con.send(aMsg);
+ }
+ // otherwise if not groupchat and user is unavailable
+ else if(user != null && user.status == "unavailable"){
+ // generate the emote message and display it to user
+ var emoteMessage = generateEmoteHTML("Your", "previous message has not been sent because " + toNick + " is unavailable");
+ updateMessageDisplay(nickToMessageArea(toNick), emoteMessage);
+ }
+
+ aForm.messageInput.value = "";
+ aForm.messageInput.focus();
return false;
}
/* ******* Event Handlers ******* */
function handleEvent(aJSJaCPacket) {
document.getElementById("iResp").innerHTML += "IN (raw):
" + htmlEnc(aJSJaCPacket.xml()) + "
";
}
+
function handleMessage(aJSJaCPacket) {
+ // get nick
var nick = aJSJaCPacket.getFrom().substring(aJSJaCPacket.getFrom().indexOf("/") + 1);
+
+ // get message
var message = htmlEnc(aJSJaCPacket.getBody());
+
+ // get type (private or group)
var type = aJSJaCPacket.getType();
+
+ // prepare htmlMessage
var htmlMessage;
+
+ // get the tag from nick
+ var tag = nickToTag(nick);
+
+ // if message is private chat
if (type == "chat") {
- htmlMessage = generateMessageHTML(nick, message, PRIVATE_MSG);
- } else {
+ // get user from nick
+ var user = roster.getUserByNick(nick);
+
+ // if sending user is not blocked
+ if(!user.blocked){
+ // if the receiver doesn't have a tab with the sender open
+ if(document.getElementById(nickToMessageArea(nick)) == null){
+ // add a tab
+ addTab(nick, tag);
+ }
+
+ // 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 html
+ htmlMessage = generateMessageHTML(nick, message);
+
+ // add the div to the sender's tab
+ updateMessageDisplay(nickToMessageArea(nick), htmlMessage);
+ }
+ }
+ // if message is groupchat
+ else {
if (type == "groupchat") {
- htmlMessage = generateMessageHTML(nick, message, GROUPCHAT_MSG);
+ // 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 label bold
+ $('#groupchat_tabLabel').html('Group Chat');
+ }
+
+ htmlMessage = generateMessageHTML(nick, message);
+ updateMessageDisplay('groupchat_messageArea', htmlMessage);
} else {
- /* somethings wrong, dont add anything.*/
+ // somethings wrong, dont add anything
htmlMessage = "";
}
}
- updateMessageDisplay(htmlMessage);
}
+
function handlePresence(presence) {
- // debug statement for presence
- //alert("presence");
+ // get presence attributes
var from = presence.getFrom();
var status = presence.getStatus();
var show = presence.getShow();
var type = presence.getType();
+
// get x element for MUC
var x;
for (var i = 0; i < presence.getNode().getElementsByTagName("x").length; i++) {
@@ -318,42 +573,118 @@
}
}
- // extract nick.
+ // extract nick
var nick;
if (from.indexOf("/") != -1) {
nick = from.substring(from.indexOf("/") + 1);
}
+
+ // get user from nick
var user = roster.getUserByNick(nick);
+
+ // if user is new
if (!user) {
+ // add use to roster
user = new RosterUser(nick);
roster.addUser(user);
}
+
+ // get tag
+ var tag = "" + user.tag;
+
+ // if presence has a specific status, assign it
if (show) {
user.status = show;
} else {
if (type) {
- if (type == "unavailable") {
+ // if type is unavailable
+ 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);
+ }
+ }
}
- } else {
- // default: means presence is available.
+ }
+ // 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 the selected tab is any other than groupchat
+ if(selected != 0){
+ // make the group chat label label bold
+ $('#groupchat_tabLabel').html('Group Chat');
+ }
+
+ // 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);
+ }
+ }
}
}
- if(FROMFLASH){
- // notify flash
- flashProxy.call("sendMessageToFlash", "Presence handled");
- }
- else {
- // NoFlash equivalent
- }
-
+ // update the roster
roster.updateDisplay();
}
+
function handleConnected() {
- //debug statement for connecton
- //alert("connected");
+ // if presence im is enabled (there is a chatbox)
+ if(presenceImEnabled == "true"){
+ // 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);
+ }
// send presence
var aPresence = new JSJaCPresence();
@@ -367,43 +698,36 @@
// set up roster
roster = new Roster();
-
- if(FROMFLASH){
- // notify flash
- flashProxy.call("sendMessageToFlash", "Connected");
+}
+
+function handleDisconnected() {
+ // if presence im is enabled (there is a chatbox)
+ if(presenceImEnabled == "true"){
+ // 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);
}
- else {
- // NoFlash equivalent
- }
}
+
function handleError(e) {
- if(FROMFLASH){
- // notify flash
- flashProxy.call("sendMessageToFlash", "Code: " + e.getAttribute("code") + " Type: " + e.getAttribute("type"));
-
- switch(e.getAttribute("code")){
+ switch(e.getAttribute("code")){
// unauthorized, try register
case "401":
- flashProxy.call("attemptRegistration");
+ doRegistration();
break;
- }
}
- else{
- switch(e.getAttribute("code")){
- // unauthorized, try register
- case "401":
- attemptRegistration();
- break;
- }
- }
}
-function breakPoint() {
- var i = 0;
+function handlePresenceRegistration(registrationInfo){
+ // if registrationInfo exists, registration worked
+ if (registrationInfo) {
+ // attempt to re-login
+ doLogin(presenceUrl, userId, userId, userId, roomName, nickname, false);
+ }
}
-
-/* ******* Init ******* */
-function doLogin(presenceServerUrl, userID, password, resource, chatroom, nickname, register, fromFlash) {
+
+/* ******* Connection function ******* */
+function doLogin(presenceServerUrl, userID, password, resource, chatroom, nickname, register) {
try {
// if register is set to false (first time login), store connection info, otherwise, just use it again
if(!register) {
@@ -413,7 +737,6 @@
XMPPDOMAIN = presenceServerUrl;
NICK = unescape(nickname);
CONFERENCEROOM = chatroom + "@conference." + presenceServerUrl;
- FROMFLASH = fromFlash;
// debug statement for connection information
//alert(HTTPBASE + USERNAME + PASSWORD + RESOURCE + XMPPDOMAIN + NICK + CONFERENCEROOM + FROMFLASH);
@@ -430,61 +753,39 @@
con.registerHandler("presence", handlePresence);
con.registerHandler("iq", handleEvent);
con.registerHandler("onconnect", handleConnected);
+ con.registerHandler("ondisconnect", handleDisconnected);
con.registerHandler("onerror", handleError);
// setup args for connect method
oArgs = {domain:XMPPDOMAIN, username:USERNAME, resource:RESOURCE, pass:PASSWORD, register:register};
con.connect(oArgs);
-
- if(FROMFLASH){
- // notify flash
- flashProxy.call("sendMessageToFlash", "Attempting connection");
- }
- else {
- // NoFlash equivalent
- }
}
catch (e) {
- flashProxy.call("sendMessageToFlash", e.toString());
+ // error
}
finally {
return false;
}
}
-function getUsers() {
- flashProxy.call("sendMessageToFlash", GetAllRosterUsers());
+
+function doRegistration(){
+ $.get(xmppServlet, {method: "createXmppId"}, handlePresenceRegistration);
}
+
+/*
function init() {
- /*
if (typeof (Debugger) == "function") {
var oDbg = new Debugger(4, "simpleclient");
oDbg.start();
}
doLogin();
- */
}
+
onload = init;
+*/
+
onunload = function () {
if (typeof (con) != "undefined" && con.disconnect) {
con.disconnect();
}
-};
-/* ******* Helper functions ******* */
-function checkEnter(e) { //e is event object passed from function invocation
- var characterCode; //literal character code will be stored in this variable
- if (e && e.which) { //if which property of event object is supported (NN4)
- e = e;
- characterCode = e.which; //character code is contained in NN4's which property
- } else {
- e = event;
- characterCode = e.keyCode; //character code is contained in IE's keyCode property
- }
- if (characterCode == 13) { //if generated character code is equal to ascii 13 (if enter key)
- //document.forms[0].submit(); //submit the form
- sendMsg(document.forms[0]);
- return false;
- } else {
- return true;
- }
-}
-
+};
\ No newline at end of file