Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java =================================================================== diff -u -r7ade5ccf0b9aa56e52b3c7e0bf86596dda369092 -ra79f1040f9d36c6adcb499f38fc38d838cda8a0b --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java (.../LearningAction.java) (revision 7ade5ccf0b9aa56e52b3c7e0bf86596dda369092) +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningAction.java (.../LearningAction.java) (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -114,11 +114,6 @@ } request.setAttribute("MODE", mode.toString()); - - // check runOffline - if (chat.getRunOffline()) { - return mapping.findForward("runOffline"); - } // Create the room if it doesnt exist if (chatSession.getJabberRoom() == null) { @@ -151,8 +146,14 @@ chat.setContentInUse(new Boolean(true)); chatService.saveOrUpdateChat(chat); } - + + // check runOffline + if (chat.getRunOffline()) { + return mapping.findForward("runOffline"); + } + return mapping.findForward("chat_client"); + } private ChatUser getCurrentUser(Long toolSessionId) { Index: lams_tool_chat/web/common/header.jsp =================================================================== diff -u -red3c47b7ae61ab6af7d88769b237943923199ad8 -ra79f1040f9d36c6adcb499f38fc38d838cda8a0b --- lams_tool_chat/web/common/header.jsp (.../header.jsp) (revision ed3c47b7ae61ab6af7d88769b237943923199ad8) +++ lams_tool_chat/web/common/header.jsp (.../header.jsp) (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -11,7 +11,7 @@ <fmt:message key="activity.title" /> - + Index: lams_tool_chat/web/includes/css/chat.css =================================================================== diff -u --- lams_tool_chat/web/includes/css/chat.css (revision 0) +++ lams_tool_chat/web/includes/css/chat.css (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -0,0 +1,64 @@ +/* LEARNING PAGE STYLES */ + +#chat_content { + width: 560px; + padding: 12px; + /* compensate for content image border */ + margin-left: 4px; +} + +#chat_pane { + width: 98%; +} + +#iResp { + height: 260px; + margin-right: 12px; + margin-left: 12px; + overflow: scroll; + border-width: 1px; + border-style: solid; + padding: 2px; +} + +#roster { + float: right; + width: 105px; + height: 260px; + overflow: hidden; + border-width: 1px; + border-style: solid; + font-weight: bold; + padding: 2px; +} + +.message { + padding-bottom: 4px; +} + +.private_message { + font-style: italic; + background-color: #e6e6fa; +} + +.messageFrom { + font-weight: bold; +} + +.selected { + background-color: lime; + padding: 2px; + cursor: pointer; +} + +.unselected { + background-color: white; + padding: 2px; + cursor: pointer; +} + +#msgArea { + width: 410px; +} + +/* END LEARNING PAGE STYLES */ \ No newline at end of file Fisheye: Tag a79f1040f9d36c6adcb499f38fc38d838cda8a0b refers to a dead (removed) revision in file `lams_tool_chat/web/includes/javascript/jsjac/examples/simpleclient.html'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_chat/web/includes/javascript/learning.js =================================================================== diff -u --- lams_tool_chat/web/includes/javascript/learning.js (revision 0) +++ lams_tool_chat/web/includes/javascript/learning.js (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -0,0 +1,313 @@ + +/* ******* Constants ******* */ +var GROUPCHAT_MSG = "groupchat_message"; +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", "#FFFF00", "#666633", "#292929", "#666666"]; +/* ******* Helper Functions ******* */ +function getColour(nick) { + var charSum = 0; + for (var i = 0; i < nick.length; i++) { + charSum += nick.charCodeAt(i); + } + return PALETTE[charSum % (PALETTE.length)]; +} +function htmlEnc(str) { + if (!str) { + return null; + } + str = str.replace(/&/g, "&"); + str = str.replace(//g, ">"); + str = str.replace(/\"/g, """); + str = str.replace(/\n/g, "
"); + return str; +} +function createElem(name, attrs, style, text) { + var e = document.createElement(name); + if (attrs) { + for (var key in attrs) { + if (key == "attrClass") { + e.className = attrs[key]; + } else { + if (key == "attrId") { + e.id = attrs[key]; + } else { + e.setAttribute(key, attrs[key]); + } + } + } + } + if (style) { + for (key in style) { + e.style[key] = style[key]; + } + } + if (text) { + e.appendChild(document.createTextNode(text)); + } + return e; +} +/* ******* Roster ******* */ +function RosterUser(nick) { + this.nick = nick; + this.status = "unavailable"; +} +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 UpdateRosterDisplay() { + var rosterDiv = document.getElementById("roster"); + rosterDiv.innerHTML = ""; + for (var i = 0; i < this.users.length; i++) { + if (this.users[i].status != "unavailable") { + var className = "unselected"; + if (i == this.currentIndex) { + className = "selected"; + } + var nick = this.users[i].nick; + var userDiv = createElem("div", {attrId:"user-" + i, attrClass:className, onClick:"selectUser(this);"}, {width:"100%", color:getColour(this.users[i].nick)}, this.users[i].nick); + rosterDiv.appendChild(userDiv); + } + } + + // change the name on the 'Send To' label + if (MODE == "teacher" && !(this.currentIndex === null)) { + var user = this.users[this.currentIndex]; + var sendToUserElem = document.getElementById("sendToUser"); + sendToUserElem.innerHTML = ""; + sendToUserElem.appendChild(createElem("span", null, {color:getColour(user.nick)}, user.nick)); + document.getElementById("sendToEveryone").style.display = "none"; + document.getElementById("sendToUser").style.display = ""; + } else { + document.getElementById("sendToUser").style.display = "none"; + document.getElementById("sendToEveryone").style.display = ""; + } +} +function Roster() { + this.users = []; + this.currentIndex = null; + // objects methods + this.getUserByNick = getRosterUserByNick; + this.addUser = AddRosterUser; + this.updateUser = UpdateRosterUser; + this.removeUser = RemoveRosterUser; + this.updateDisplay = UpdateRosterDisplay; +} +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; + } + roster.updateDisplay(); + } +} +/* ******* Chat functions ******* */ +function generateMessageHTML(nick, message, type) { + var colour = getColour(nick); + var fromElem = createElem("span", {attrClass:"messageFrom"}, {color:colour}, nick); + var msgElem = createElem("div", {attrClass:"message " + type}, {color:colour}, null); + msgElem.innerHTML = message; + msgElem.insertBefore(document.createElement("br"), msgElem.firstChild); + msgElem.insertBefore(fromElem, msgElem.firstChild); + return msgElem; +} +function updateMessageDisplay(htmlMessage) { + var iRespDiv = document.getElementById("iResp"); + iRespDiv.appendChild(htmlMessage); + iRespDiv.scrollTop = iRespDiv.scrollHeight; +} +function sendMsg(aForm) { + if (aForm.msg.value === "") { + return false; // do not send empty messages. + } + var aMsg = new JSJaCMessage(); + if (MODE == "teacher" && !(roster.currentIndex === null)) { + var toNick = roster.users[roster.currentIndex].nick; + aMsg.setTo(CONFERENCEROOM + "/" + toNick); + aMsg.setType("chat"); + // 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, aForm.msg.value, PRIVATE_MSG)); + } + } else { + aMsg.setTo(CONFERENCEROOM); + aMsg.setType("groupchat"); + } + + // } + aMsg.setFrom(USERNAME + "@" + XMPPDOMAIN + "/" + RESOURCE); + aMsg.setBody(aForm.msg.value); + con.send(aMsg); + aForm.msg.value = ""; + return false; +} +/* ******* Event Handlers ******* */ +function handleEvent(aJSJaCPacket) { + document.getElementById("iResp").innerHTML += "IN (raw):
" + htmlEnc(aJSJaCPacket.xml()) + "
"; +} +function handleMessage(aJSJaCPacket) { + var nick = aJSJaCPacket.getFrom().substring(aJSJaCPacket.getFrom().indexOf("/") + 1); + var message = htmlEnc(aJSJaCPacket.getBody()); + var type = aJSJaCPacket.getType(); + var htmlMessage; + if (type == "chat") { + htmlMessage = generateMessageHTML(nick, message, PRIVATE_MSG); + } else { + if (type == "groupchat") { + htmlMessage = generateMessageHTML(nick, message, GROUPCHAT_MSG); + } else { + /* somethings wrong, dont add anything.*/ + htmlMessage = ""; + } + } + updateMessageDisplay(htmlMessage); +} +function handlePresence(presence) { + 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++) { + if (presence.getNode().getElementsByTagName("x").item(i).getAttribute("xmlns") == "http://jabber.org/protocol/muc#user") { + x = presence.getNode().getElementsByTagName("x").item(i); + break; + } + } + + // extract nick. + var nick; + if (from.indexOf("/") != -1) { + nick = from.substring(from.indexOf("/") + 1); + } + var user = roster.getUserByNick(nick); + if (!user) { + user = new RosterUser(nick); + roster.addUser(user); + } + if (show) { + user.status = show; + } else { + if (type) { + if (type == "unavailable") { + user.status = "unavailable"; + } + } else { + // default: means presence is available. + user.status = "available"; + } + } + roster.updateDisplay(); +} +function handleConnected() { + if (MODE == "learner") { + if (LEARNER_FINISHED == "true") { + //document.getElementById("notebookEntry_pane").style.display = ""; + if (LOCK_ON_FINISHED == "true") { + // disable sending messages. + document.getElementById("msgArea").disabled = "disabled"; + document.getElementById("sendButton").disabled = "disabled"; + } + } + } + + // clear the response window. + document.getElementById("iResp").innerHTML = ""; + + // send presence + var aPresence = new JSJaCPresence(); + aPresence.setTo(CONFERENCEROOM + "/" + NICK); + aPresence.setFrom(USERNAME + "@" + XMPPDOMAIN); + var x = aPresence.getDoc().createElement("x"); + x.setAttribute("xmlns", "http://jabber.org/protocol/muc"); + x.appendChild(aPresence.getDoc().createElement("password")).appendChild(aPresence.getDoc().createTextNode(PASSWORD)); + aPresence.getNode().appendChild(x); + con.send(aPresence); + + // set up roster + roster = new Roster(); +} +function handleError(e) { + document.getElementById("msgArea").disabled = "disabled"; + document.getElementById("sendButton").disabled = "disabled"; + document.getElementById("iResp").innerHTML = "Couldn't connect. Please try again...
" + htmlEnc("Code: " + e.getAttribute("code") + "\nType: " + e.getAttribute("type") + "\nCondition: " + e.firstChild.nodeName); + document.getElementById("roster").innerHTML = ""; +} +/* ******* Init ******* */ +function doLogin() { + try { + + // setup args for contructor + var oArgs = {httpbase:HTTPBASE, timerval:2000}; + if (typeof (oDbg) != "undefined") { + oArgs.oDbg = oDbg; + } + con = new JSJaCHttpBindingConnection(oArgs); + con.registerHandler("message", handleMessage); + con.registerHandler("presence", handlePresence); + con.registerHandler("iq", handleEvent); + con.registerHandler("onconnect", handleConnected); + con.registerHandler("onerror", handleError); + + // setup args for connect method + oArgs = {domain:XMPPDOMAIN, username:USERNAME, resource:RESOURCE, pass:PASSWORD}; + con.connect(oArgs); + } + catch (e) { + document.getElementById("iResp").innerHTML = e.toString(); + } + finally { + return false; + } +} +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; + } +} Index: lams_tool_chat/web/includes/javascript/monitoring.js =================================================================== diff -u --- lams_tool_chat/web/includes/javascript/monitoring.js (revision 0) +++ lams_tool_chat/web/includes/javascript/monitoring.js (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -0,0 +1,18 @@ + +function init() { + + // initialising tabs + initTabSize(4); + + // open the first tab + selectTab(1); +} + +function doSelectTab(tabId) { + selectTab(tabId); +} +function doSubmit(method, tabId) { + document.monitoringForm.method.value = method; + document.monitoringForm.submit(); +} + Fisheye: Tag a79f1040f9d36c6adcb499f38fc38d838cda8a0b refers to a dead (removed) revision in file `lams_tool_chat/web/includes/javascript/xmlrequest.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag a79f1040f9d36c6adcb499f38fc38d838cda8a0b refers to a dead (removed) revision in file `lams_tool_chat/web/pages/learning/chat_app.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 6b63bb5d8724c2bd120e62b48b99894dc030a1c1 refers to a dead (removed) revision in file `lams_tool_chat/web/pages/learning/learning.jsp'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_chat/web/pages/learning/part/finishButton.jsp =================================================================== diff -u --- lams_tool_chat/web/pages/learning/part/finishButton.jsp (revision 0) +++ lams_tool_chat/web/pages/learning/part/finishButton.jsp (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -0,0 +1,33 @@ +<%@ include file="/common/taglibs.jsp"%> + + + + + + + + + + + + + + ${buttonLabel} + + +
+
+ + + +
+

+ ${chatDTO.reflectInstructions} +

+

+ ${chatUserDTO.notebookEntry} +

+
+
+
+
Index: lams_tool_chat/web/pages/learning/runOffline.jsp =================================================================== diff -u -r4723715bee4472a5a41fc2cafd690b23b7ae4e2a -ra79f1040f9d36c6adcb499f38fc38d838cda8a0b --- lams_tool_chat/web/pages/learning/runOffline.jsp (.../runOffline.jsp) (revision 4723715bee4472a5a41fc2cafd690b23b7ae4e2a) +++ lams_tool_chat/web/pages/learning/runOffline.jsp (.../runOffline.jsp) (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -5,6 +5,7 @@
+
@@ -14,15 +15,7 @@
- -
- - - - button.finish - -
-
+ <%@ include file="part/finishButton.jsp"%>
Index: lams_tool_chat/web/pages/monitoring/headItems.jsp =================================================================== diff -u -rcb76f52be2b0d9280291cf11cac9f4efe99a0648 -ra79f1040f9d36c6adcb499f38fc38d838cda8a0b --- lams_tool_chat/web/pages/monitoring/headItems.jsp (.../headItems.jsp) (revision cb76f52be2b0d9280291cf11cac9f4efe99a0648) +++ lams_tool_chat/web/pages/monitoring/headItems.jsp (.../headItems.jsp) (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -1,30 +1,9 @@ -<%-- Monitoring Head Content --%> - <%@ include file="/common/taglibs.jsp"%> - - + + + - - \ No newline at end of file + Index: lams_tool_chat/web/pages/monitoring/monitoring.jsp =================================================================== diff -u -r0ac012d04d1fa2ee4df7139645ba7fecaa8b2a6e -ra79f1040f9d36c6adcb499f38fc38d838cda8a0b --- lams_tool_chat/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision 0ac012d04d1fa2ee4df7139645ba7fecaa8b2a6e) +++ lams_tool_chat/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision a79f1040f9d36c6adcb499f38fc38d838cda8a0b) @@ -1,9 +1,6 @@ <%@ include file="/common/taglibs.jsp"%>