Index: lams_tool_chat/web/pages/learning/chat_app.js =================================================================== diff -u -r4723715bee4472a5a41fc2cafd690b23b7ae4e2a -r4d1146e33ddcaae15e13756729802dd5008aad00 --- lams_tool_chat/web/pages/learning/chat_app.js (.../chat_app.js) (revision 4723715bee4472a5a41fc2cafd690b23b7ae4e2a) +++ lams_tool_chat/web/pages/learning/chat_app.js (.../chat_app.js) (revision 4d1146e33ddcaae15e13756729802dd5008aad00) @@ -8,297 +8,309 @@ // Helper functions 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; + if (!str) { + return null; + } + str = str.replace(/&/g, "&"); + str = str.replace(//g, ">"); + str = str.replace(/\"/g, """); + str = str.replace(/\n/g, "
"); + return str; } function getColour(nick) { - var charSum = 0; - for (var i = 0; i < nick.length; i++) { - charSum += nick.charCodeAt(i); - } - return colours[charSum % (colours.length)]; + var charSum = 0; + for (var i = 0; i < nick.length; i++) { + charSum += nick.charCodeAt(i); + } + return colours[charSum % (colours.length)]; } +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; + } +} // creates a new element. function createElem(name, attrs, style, text) { - var e = document.createElement(name); - if (attrs) { - for (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; - + var e = document.createElement(name); + if (attrs) { + for (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"; + this.nick = nick; + this.status = "unavailable"; } function getRosterUserByNick(nick) { - for (var i = 0; i < roster.users.length; i++) { - if (roster.users[i].nick == nick) { - return roster.users[i]; - } - } + for (var i = 0; i < roster.users.length; i++) { + if (roster.users[i].nick == nick) { + return roster.users[i]; + } + } } function AddRosterUser(user) { - roster.users[roster.users.length] = user; + roster.users[roster.users.length] = user; } function UpdateRosterUser(user) { } function RemoveRosterUser() { } function updateRosterDisplay() { - var oSelect = document.getElementById("roster_user_selector"); - oSelect.innerHTML = ""; - var oOption; - var nick; - for (var i = 0; i < roster.users.length; i++) { - if (roster.users[i].status != "unavailable") { - nick = roster.users[i].nick; - oOption = new Option(nick, nick); - oSelect.options[oSelect.options.length] = oOption; - } - } + var oSelect = document.getElementById("roster_user_selector"); + oSelect.innerHTML = ""; + var oOption; + var nick; + for (var i = 0; i < roster.users.length; i++) { + if (roster.users[i].status != "unavailable") { + nick = roster.users[i].nick; + oOption = new Option(nick, nick); + oSelect.options[oSelect.options.length] = oOption; + } + } } function Roster() { - this.users = []; + this.users = []; // objects methods - this.getUserByNick = getRosterUserByNick; - this.addUser = AddRosterUser; - this.updateUser = UpdateRosterUser; - this.removeUser = RemoveRosterUser; - this.updateDisplay = updateRosterDisplay; + this.getUserByNick = getRosterUserByNick; + this.addUser = AddRosterUser; + this.updateUser = UpdateRosterUser; + this.removeUser = RemoveRosterUser; + this.updateDisplay = updateRosterDisplay; } function resetInputs() { - document.getElementById("roster_user_selector").selectedIndex = -1; - updateSendDisplay(); + document.getElementById("roster_user_selector").selectedIndex = -1; + updateSendDisplay(); } function updateSendDisplay() { - var rosterList = document.getElementById("roster_user_selector"); - var selectedIndex = rosterList.selectedIndex; - if (MODE == "teacher" && !(selectedIndex == -1)) { - var userName = rosterList.options[rosterList.selectedIndex].value; - document.getElementById("sendToUser").innerHTML = "" + userName + ""; - document.getElementById("sendToEveryone").style.display = "none"; - document.getElementById("sendToUser").style.display = ""; - } else { - document.getElementById("sendToUser").style.display = "none"; - document.getElementById("sendToEveryone").style.display = ""; - } + var rosterList = document.getElementById("roster_user_selector"); + var selectedIndex = rosterList.selectedIndex; + if (MODE == "teacher" && !(selectedIndex == -1)) { + var userName = rosterList.options[rosterList.selectedIndex].value; + document.getElementById("sendToUser").innerHTML = "" + userName + ""; + document.getElementById("sendToEveryone").style.display = "none"; + document.getElementById("sendToUser").style.display = ""; + } else { + document.getElementById("sendToUser").style.display = "none"; + document.getElementById("sendToEveryone").style.display = ""; + } } 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; + 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; + var iRespDiv = document.getElementById("iResp"); + iRespDiv.appendChild(htmlMessage); + iRespDiv.scrollTop = iRespDiv.scrollHeight; } // Event handlers function handleEvent(aJSJaCPacket) { - document.getElementById("iResp").innerHTML += "IN (raw):
" + htmlEnc(aJSJaCPacket.xml()) + "
"; + 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); + 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(); + 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; - } - } + 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 { + 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.updateUser(user); - roster.updateDisplay(); - updateSendDisplay(); + user.status = "available"; + } + } + roster.updateUser(user); + roster.updateDisplay(); + updateSendDisplay(); } function handleConnected() { - document.getElementById("login_pane").style.display = "none"; - document.getElementById("chat_pane").style.display = ""; - if (MODE == "learner") { - if (LEARNER_FINISHED == "true") { - - document.getElementById("notebookEntry_pane").style.display = ""; - - if (LOCK_ON_FINISHED == "true") { + document.getElementById("login_pane").style.display = "none"; + document.getElementById("chat_pane").style.display = ""; + 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"; - document.getElementById("clearButton").disabled = "disabled"; - } - } else { - document.getElementById("finishButton_pane").style.display = ""; - } - } - if (MODE == "author") { - document.getElementById("finishButton_pane").style.display = ""; - } + document.getElementById("msgArea").disabled = "disabled"; + document.getElementById("sendButton").disabled = "disabled"; + document.getElementById("clearButton").disabled = "disabled"; + } + } else { + document.getElementById("finishButton_pane").style.display = ""; + } + } + if (MODE == "author") { + document.getElementById("finishButton_pane").style.display = ""; + } // 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); + 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(); + roster = new Roster(); } function handleError(e) { - document.getElementById("loading_message").style.display = "none"; - document.getElementById("login_err").innerHTML = "Couldn't connect. Please try again...
" + htmlEnc("Code: " + e.getAttribute("code") + "\nType: " + e.getAttribute("type") + "\nCondition: " + e.firstChild.nodeName); - document.getElementById("finishButton_pane").style.display = ""; + document.getElementById("loading_message").style.display = "none"; + document.getElementById("login_err").innerHTML = "Couldn't connect. Please try again...
" + htmlEnc("Code: " + e.getAttribute("code") + "\nType: " + e.getAttribute("type") + "\nCondition: " + e.firstChild.nodeName); + document.getElementById("finishButton_pane").style.display = ""; } function doLogin() { - try { + try { // setup args for contructor - oArgs = new Object(); - oArgs.httpbase = HTTPBASE; - oArgs.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); + oArgs = new Object(); + oArgs.httpbase = HTTPBASE; + oArgs.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 = new Object(); - oArgs.domain = XMPPDOMAIN; - oArgs.username = USERNAME; - oArgs.resource = RESOURCE; - oArgs.pass = PASSWORD; - con.connect(oArgs); - } - catch (e) { - document.getElementById("login_err").innerHTML = e.toString(); - document.getElementById("finishButton_pane").style.display = ""; - } - finally { - return false; - } + oArgs = new Object(); + oArgs.domain = XMPPDOMAIN; + oArgs.username = USERNAME; + oArgs.resource = RESOURCE; + oArgs.pass = PASSWORD; + con.connect(oArgs); + } + catch (e) { + document.getElementById("login_err").innerHTML = e.toString(); + document.getElementById("finishButton_pane").style.display = ""; + } + finally { + return false; + } } function sendMsg(aForm) { - var aMsg = new JSJaCMessage(); - var rosterList = document.getElementById("roster_user_selector"); - var selectedIndex = rosterList.selectedIndex; - if (MODE == "teacher" && !(selectedIndex == -1)) { - var toNick = rosterList.options[selectedIndex].value; - aMsg.setTo(CONFERENCEROOM + "/" + toNick); - aMsg.setType("chat"); + var aMsg = new JSJaCMessage(); + var rosterList = document.getElementById("roster_user_selector"); + var selectedIndex = rosterList.selectedIndex; + if (MODE == "teacher" && !(selectedIndex == -1)) { + var toNick = rosterList.options[selectedIndex].value; + 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"); - } + 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; + aMsg.setFrom(USERNAME + "@" + XMPPDOMAIN + "/" + RESOURCE); + aMsg.setBody(aForm.msg.value); + con.send(aMsg); + aForm.msg.value = ""; + return false; } function init() { - if (typeof (Debugger) == "function") { - oDbg = new Debugger(4, "simpleclient"); - oDbg.start(); - } - doLogin(); + if (typeof (Debugger) == "function") { + oDbg = new Debugger(4, "simpleclient"); + oDbg.start(); + } + doLogin(); } onload = init; onunload = function () { - if (typeof (con) != "undefined" && con.disconnect) { - con.disconnect(); - } + if (typeof (con) != "undefined" && con.disconnect) { + con.disconnect(); + } }; Index: lams_tool_chat/web/pages/learning/chat_ui.jsp =================================================================== diff -u -r4723715bee4472a5a41fc2cafd690b23b7ae4e2a -r4d1146e33ddcaae15e13756729802dd5008aad00 --- lams_tool_chat/web/pages/learning/chat_ui.jsp (.../chat_ui.jsp) (revision 4723715bee4472a5a41fc2cafd690b23b7ae4e2a) +++ lams_tool_chat/web/pages/learning/chat_ui.jsp (.../chat_ui.jsp) (revision 4d1146e33ddcaae15e13756729802dd5008aad00) @@ -74,9 +74,12 @@ label.everyone - - - + + + + +
@@ -107,12 +110,16 @@
- +
- +