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