OK here is the code for the PM PopUp Tabs. As I have
already mentioned it's not quite finished and there is some minor bugs,
mostly cosmetic, and I also want to tidy up the code and remove any
unwanted code or elements that is no longer needed but other than that
it is working fine.
If you have any problems let me know and I
will attatch the files directly, but I must say I have edited and made a
number of changes to the code.
In chat.js
Find
menu = '<li><a href="javascript:ajaxChat.insertMessageWrapper(\'/msg '
+ encodedUserName
+ ' \');">'
+ this.lang['userMenuSendPrivateMessage']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.insertMessageWrapper(\'/describe '
+ encodedUserName
+ ' \');">'
+ this.lang['userMenuDescribe']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.sendMessageWrapper(\'/query '
+ encodedUserName
+ '\');">'
+ this.lang['userMenuOpenPrivateChannel']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.sendMessageWrapper(\'/query\');">'
+ this.lang['userMenuClosePrivateChannel']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.sendMessageWrapper(\'/ignore '
+ encodedUserName
+ '\');">'
+ this.lang['userMenuIgnore']
+ '</a></li>';
And replace with the following
menu = '<li><a href="javascript:ajaxChat.insertMessageWrapper(\'/msg '
+ encodedUserName
+ ' \');PMPopupBox(\'' + encodedUserName + '\', \'' + userID + '\' );">'
+ this.lang['userMenuSendPrivateMessage']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.insertMessageWrapper(\'/describe '
+ encodedUserName
+ ' \');">'
+ this.lang['userMenuDescribe']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.sendMessageWrapper(\'/query '
+ encodedUserName
+ '\');">'
+ this.lang['userMenuOpenPrivateChannel']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.sendMessageWrapper(\'/query\');">'
+ this.lang['userMenuClosePrivateChannel']
+ '</a></li>'
+ '<li><a href="javascript:ajaxChat.sendMessageWrapper(\'/ignore '
+ encodedUserName
+ '\');">'
+ this.lang['userMenuIgnore']
+ '</a></li>';
Now find
switch(messageParts[0]) {
case '/privmsg':
And directly blow that add the following
var GetPmUser = userName;
var GetPmUserID = userID;
var GetPmText = messageText;
//alert("UserName: "+ GetPmUser + " UserID: " + GetPmUserID + " Text: " + GetPmText);
if (document.getElementById(GetPmUserID) === null) {
var obj = document.createElement('div');
obj.id = GetPmUserID;
obj.style.cssText = 'float:left; margin-left:5px; overflow:hidden; width:240px; position:relative;';
document.getElementById("PopUpHolder").appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMtab"+GetPmUserID;
obj.className = GetPmUserID;
obj.style.cssText = 'background:#0CF;
background-image: linear-gradient(lightblue, #0CF, lightblue);
border-top-right-radius: 8px; border-top-left-radius: 8px; height: 20px;
width: 160px; display: block; font-size: 14px; font-weight: bold;
vertical-align: middle; padding-left: 2px; border-top-width: thin;
border-right-width: thin; border-left-width: thin; border-top-style:
groove; border-right-style: groove; border-left-style: groove;
border-top-color: #000; border-right-color: #000; border-left-color:
#000; overflow: hidden; position: relative; float: left;
border-bottom-width: thin; cursor: pointer;';
obj.setAttribute('onclick','minimizepm(this)');
document.getElementById(GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMuser"+GetPmUserID;
obj.style.cssText = 'float: left; overflow: hidden; color: #FF0; font-size: 12px; padding-top: 3px; padding-right: 10px;';
document.getElementById("PMtab"+GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMclose"+GetPmUserID;
obj.class = "PMclose"+GetPmUserID;
obj.style.cssText = 'float: right; color: #FFF; display: block; padding-right: 5px; cursor: pointer; position: relative;';
obj.innerText = "X";
obj.setAttribute('onclick','closepm(this)');
document.getElementById("PMtab"+GetPmUserID).appendChild(obj);
var obj = document.createElement('input');
obj.id = "Hidmsg"+GetPmUserID;
obj.class = "Hidmsg"+GetPmUserID;
obj.type = "hidden";
obj.style.cssText = '';
document.getElementById(GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMContainer"+GetPmUserID;
obj.class = "PMContainer"+GetPmUserID;
obj.style.cssText = value='width:
auto; border: thin groove #666; background-color: #0FF; display: block;
clear: left; white-space: normal; overflow: hidden; padding: 5px;
word-spacing: normal; float: left; position: relative;';
document.getElementById(GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMBox"+GetPmUserID;
obj.class = GetPmUser;
obj.style.cssText = value='height:
250px; width: 216px; border: thin groove #666; background-color: #0FF;
display: block; clear: left; white-space: normal; overflow-y: scroll;
padding: 5px; word-spacing: normal; float: left;';
document.getElementById("PMContainer"+GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "MsgInput"+GetPmUserID;
obj.class = "MsgInput"+GetPmUserID;
obj.style.cssText = value='-moz-box-sizing:
border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
width: 100%; margin: 0;/*remove defaults*/ background: #EEF; border: 1px
solid #333; overflow-y: auto;/*resets IE*/ overflow-x: hidden;
overflow: hidden; float: left;';
document.getElementById("PMContainer"+GetPmUserID).appendChild(obj);
var obj = document.createElement('span');
obj.id = "MsgSpan"+GetPmUserID;
obj.class = "MsgSpan"+GetPmUserID;
obj.style.cssText = value='display: block; overflow: hidden;';
document.getElementById("MsgInput"+GetPmUserID).appendChild(obj);
var obj = document.createElement('textarea');
obj.id = "SndMsg"+GetPmUserID;
obj.class = GetPmUserID;
obj.style.cssText = value='width:100%; height: 20px;';
obj.setAttribute('onkeyup','ajaxChat.handleSndMsgFieldKeyUp(event)');
obj.setAttribute('onkeydown','ajaxChat.handleSndMsgFieldKeyDown(event)');
document.getElementById("MsgInput"+GetPmUserID).appendChild(obj);
var GetPMBox = GetPmUser;
var GetHidmsg = "Hidmsg"+GetPmUserID;
$('#PMuser'+GetPmUserID).html(GetPmUser)
document.getElementById('Hidmsg'+GetPmUserID).value = "/msg " + GetPmUser + " ";
var result = GetPmText.replace('/privmsg','');
var thisresult = result.replace(/ *\[[^\]]*]/g, '');
$('#PMBox' + GetPmUserID).append("<b>"+ GetPmUser +":</b> " + thisresult+"<br/>");
var objDiv = document.getElementById("PMBox" + GetPmUserID);
objDiv.scrollTop = objDiv.scrollHeight;
}
else {
var result = GetPmText.replace('/privmsg','');
var thisresult = result.replace(/ *\[[^\]]*]/g, '');
document.getElementById(GetPmUserID).style.display='block'
$('#PMBox' + GetPmUserID).append("<b>"+ GetPmUser +":</b> " + thisresult+"<br/>");
var objDiv = document.getElementById("PMBox" + GetPmUserID);
objDiv.scrollTop = objDiv.scrollHeight;
}
Now find
handleInputFieldKeyDown: function(event) {
var text, lastWord, i;
// Enter key without shift should send messages
if(event.keyCode === 13 && !event.shiftKey) {
this.sendMessage();
try {
event.preventDefault();
} catch(e) {
event.returnValue = false; // IE<9
}
return false;
}
// Tab should complete usernames
else if(event.keyCode === 9 && !event.shiftKey) {
text = this.dom['inputField'].value;
if(text) {
lastWord = text.match(/\w+/g).slice(-1)[0];
if (lastWord.length > 1) {
for (i = 0; i < this.userNamesList.length; i++) {
if(this.userNamesList[i].replace("(","").toLowerCase().indexOf
(lastWord.toLowerCase()) === 0) {
this.dom['inputField'].value = text.replace(new RegExp(lastWord +
'$'), this.userNamesList[i]);
break;
}
}
}
}
try {
event.preventDefault();
} catch(e) {
event.returnValue = false; // IE
}
return false;
}
return true;
},
handleInputFieldKeyUp: function(event) {
this.updateMessageLengthCounter();
},
updateMessageLengthCounter: function() {
if(this.dom['messageLengthCounter']) {
this.updateDOM(
'messageLengthCounter',
this.dom['inputField'].value.length + '/' + this.messageTextMaxLength,
false,
true
);
}
},
sendMessage: function(text) {
text = text ? text : this.dom['inputField'].value;
if(!text) {
return;
}
text = this.parseInputMessage(text);
if(text) {
clearTimeout(this.timer);
var message = 'lastID='
+ this.lastID
+ '&text='
+ this.encodeText(text);
this.makeRequest(this.ajaxURL,'POST',message);
}
this.dom['inputField'].value = '';
this.dom['inputField'].focus();
this.updateMessageLengthCounter();
},
And replace with the following
//Handlers for PM Popup
handleSndMsgFieldKeyDown: function(event) {
var PMinputID = event.target.id;
var PMUserID2 = event.target.class;
//alert(PMUserID2);
var MyPmTxt = PMinputID.substring(6);
var KpTxt = document.getElementById('Hidmsg'+ MyPmTxt).value
var PMMsgTxt = event.target.value;
var text, lastWord, i;
// Enter key without shift should send messages
if(event.keyCode === 13 && !event.shiftKey) {
document.getElementById('Hidmsg'+ PMUserID2).value = document.getElementById('Hidmsg'+
PMUserID2).value + PMMsgTxt;
document.getElementById('TempMsgHolder').value = document.getElementById('Hidmsg'+
PMUserID2).value;
var UserSend = document.getElementById('PMuser'+ PMUserID2).value;
var MyUserName = document.getElementById('MyUserName').value;
$('#PMBox' + PMUserID2).append("<b>"+ MyUserName +":</b> " + PMMsgTxt+"<br/>");
var objDiv = document.getElementById("PMBox" + PMUserID2);
objDiv.scrollTop = objDiv.scrollHeight;
this.sendMessage();
document.getElementById('Hidmsg'+ PMUserID2).value = KpTxt;
document.getElementById('TempMsgHolder').value = " ";
document.getElementById('SndMsg'+ PMUserID2).value = "";
try {
event.preventDefault();
} catch(e) {
event.returnValue = false; // IE<9
}
return false;
}
// Tab should complete usernames
else if(event.keyCode === 9 && !event.shiftKey) {
text = document.getElementById(PMinputID).value;
//text = this.dom['inputField'].value;
if(text) {
lastWord = text.match(/\w+/g).slice(-1)[0];
if (lastWord.length > 1) {
for (i = 0; i < this.userNamesList.length; i++) {
if(this.userNamesList[i].replace("(","").toLowerCase().indexOf
(lastWord.toLowerCase()) === 0) {
document.getElementById(PMinputID).value = text.replace(new
RegExp(lastWord + '$'), this.userNamesList[i])+" ";
break;
}
}
}
}
try {
event.preventDefault();
} catch(e) {
event.returnValue = false; // IE
}
return false;
}
return true;
},
handleSndMsgFieldKeyUp: function(event) {
this.updateMessageLengthCounter();
},
handleInputFieldKeyDown: function(event) {
var text, lastWord, i;
// Enter key without shift should send messages
if(event.keyCode === 13 && !event.shiftKey) {
this.sendMessage();
try {
event.preventDefault();
} catch(e) {
event.returnValue = false; // IE<9
}
return false;
}
// Tab should complete usernames
else if(event.keyCode === 9 && !event.shiftKey) {
text = this.dom['inputField'].value;
if(text) {
lastWord = text.match(/\w+/g).slice(-1)[0];
if (lastWord.length > 1) {
for (i = 0; i < this.userNamesList.length; i++) {
if(this.userNamesList[i].replace("(","").toLowerCase().indexOf
(lastWord.toLowerCase()) === 0) {
this.dom['inputField'].value = text.replace(new RegExp(lastWord +
'$'), this.userNamesList[i])+" ";
break;
}
}
}
}
try {
event.preventDefault();
} catch(e) {
event.returnValue = false; // IE
}
return false;
}
return true;
},
handleInputFieldKeyUp: function(event) {
this.updateMessageLengthCounter();
},
updateMessageLengthCounter: function(userID) {
userID = this.userID;
if(this.dom['messageLengthCounter']) {
this.updateDOM(
'messageLengthCounter',
this.dom['inputField'].value.length + '/' + this.messageTextMaxLength,
//this.dom['SndMsg'+userID].value.length + '/' + this.messageTextMaxLength,
false,
true
);
}
},
sendMessage: function(text) {
var snd = document.getElementById('TempMsgHolder').value;
if (snd > " "){
text = text ? text : snd;
}
else {
text = text ? text : this.dom['inputField'].value;
}
document.getElementById('TempMsgHolder').value == "";
if(!text) {
return;
}
text = this.parseInputMessage(text);
if(text) {
clearTimeout(this.timer);
var message = 'lastID='
+ this.lastID
+ '&text='
+ this.encodeText(text);
this.makeRequest(this.ajaxURL,'POST',message);
}
this.dom['inputField'].value = '';
//this.dom['inputField'].focus();
this.updateMessageLengthCounter();
},
Now find
insertMessageWrapper: function(text) {
And directly blow that add the following
var ret = text.replace('/msg','');
And at the very end of chat.js after the last closing } add the following
//Create PM POPup
function PMPopupBox(userName, userID, messageText) {
var GetPmUser = userName;
var GetPmUserID = userID;
var GetPmText = messageText;
if (document.getElementById(GetPmUserID) === null) {
var obj = document.createElement('div');
obj.id = GetPmUserID;
obj.style.cssText = 'float:left; margin-left:5px; overflow:hidden; width:240px; position:relative;';
document.getElementById("PopUpHolder").appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMtab"+GetPmUserID;
obj.className = GetPmUserID;
obj.style.cssText = 'background:#0CF;
background-image: linear-gradient(lightblue, #0CF, lightblue);
border-top-right-radius: 8px; border-top-left-radius: 8px; height: 20px;
width: 160px; display: block; font-size: 14px; font-weight: bold;
vertical-align: middle; padding-left: 2px; border-top-width: thin;
border-right-width: thin; border-left-width: thin; border-top-style:
groove; border-right-style: groove; border-left-style: groove;
border-top-color: #000; border-right-color: #000; border-left-color:
#000; overflow: hidden; position: relative; float: left;
border-bottom-width: thin; cursor: pointer;';
obj.setAttribute('onclick','minimizepm(this)');
document.getElementById(GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMuser"+GetPmUserID;
obj.style.cssText = 'float: left; overflow: hidden; color: #FF0; font-size: 12px; padding-top: 3px; padding-right: 10px;';
document.getElementById("PMtab"+GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMclose"+GetPmUserID;
obj.class = "PMclose"+GetPmUserID;
obj.style.cssText = 'float: right; color: #FFF; display: block; padding-right: 5px; cursor: pointer; position: relative;';
obj.innerText = "X";
obj.setAttribute('onclick','closepm(this)');
document.getElementById("PMtab"+GetPmUserID).appendChild(obj);
var obj = document.createElement('input');
obj.id = "Hidmsg"+GetPmUserID;
obj.class = "Hidmsg"+GetPmUserID;
obj.type = "hidden";
obj.style.cssText = '';
document.getElementById(GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMContainer"+GetPmUserID;
obj.class = "PMContainer"+GetPmUserID;
obj.style.cssText = value='width:
auto; border: thin groove #666; background-color: #0FF; display: block;
clear: left; white-space: normal; overflow: hidden; padding: 5px;
word-spacing: normal; float: left; position: relative;';
document.getElementById(GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "PMBox"+GetPmUserID;
obj.class = GetPmUser;
obj.style.cssText = value='height:
250px; width: 216px; border: thin groove #666; background-color: #0FF;
display: block; clear: left; white-space: normal; overflow-y: scroll;
padding: 5px; word-spacing: normal; float: left;';
document.getElementById("PMContainer"+GetPmUserID).appendChild(obj);
var obj = document.createElement('div');
obj.id = "MsgInput"+GetPmUserID;
obj.class = "MsgInput"+GetPmUserID;
obj.style.cssText = value='-moz-box-sizing:
border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
width: 100%; margin: 0;/*remove defaults*/ background: #EEF; border: 1px
solid #333; overflow-y: auto;/*resets IE*/ overflow-x: hidden;
overflow: hidden; float: left;';
document.getElementById("PMContainer"+GetPmUserID).appendChild(obj);
var obj = document.createElement('span');
obj.id = "MsgSpan"+GetPmUserID;
obj.class = "MsgSpan"+GetPmUserID;
obj.style.cssText = value='display: block; overflow: hidden;';
document.getElementById("MsgInput"+GetPmUserID).appendChild(obj);
var obj = document.createElement('textarea');
obj.id = "SndMsg"+GetPmUserID;
obj.class = GetPmUserID;
obj.style.cssText = value='width:100%; height: 30px;';
obj.setAttribute('onkeyup','ajaxChat.handleSndMsgFieldKeyUp(event)');
obj.setAttribute('onkeydown','ajaxChat.handleSndMsgFieldKeyDown(event)');
document.getElementById("MsgInput"+GetPmUserID).appendChild(obj);
var GetPMBox = GetPmUser;
var GetHidmsg = "Hidmsg"+GetPmUserID;
$('#PMuser'+GetPmUserID).html(GetPmUser)
document.getElementById('Hidmsg'+GetPmUserID).value = "/msg " + GetPmUser + " ";
++i;
var result = GetPmText.replace('/privmsg','');
$('#PMBox' + GetPmUserID).append("<b>"+ GetPmUser +":</b> " + result+"<br/>");
var objDiv = document.getElementById("PMBox" + GetPmUserID);
objDiv.scrollTop = objDiv.scrollHeight;
}
else {
document.getElementById(GetPmUserID).style.display ='block';
document.getElementById(PMContainer+GetPmUserID).style.display ='block';;
document.getElementById(PMtab+GetPmUserID).style.borderBottom = 'none';
document.getElementById(PMPopup+GetPmUserID).style.width = "220px";
var objDiv = document.getElementById("PMBox" + GetPmUserID);
objDiv.scrollTop = objDiv.scrollHeight;
}
}
//Minmize PM POPup
function minimizepm(elem) {
var thisval = elem.className;
var getPMID = "PMContainer" + thisval;
var getPMtab = "PMtab" + thisval;
var getPMPopup = "PMPopup" + thisval;
//alert(getPMID);
var x = document.getElementById(getPMID);
//alert(x);
if (x.style.display === "block") {
document.getElementById(getPMID).style.display ='none';
//document.getElementById(thisval).style.width = '160px';
//document.getElementById(getPMPopup).style.width = "160px";
document.getElementById(getPMtab).style.borderBottom = 'groove';
var objDiv = document.getElementById("PMBox" + getPMID);
objDiv.scrollTop = objDiv.scrollHeight;
}
else {
document.getElementById(getPMID).style.display ='block';
//document.getElementById(thisval).style.width = '220px';
//document.getElementById(getPMPopup).style.width = "250px";
document.getElementById(getPMtab).style.borderBottom = 'none';
var objDiv = document.getElementById("PMBox" + getPMID);
objDiv.scrollTop = objDiv.scrollHeight;
}
}
function closepm(elem) {
var PMPopup = elem.parentNode.parentNode.id;
//alert(elem.parentNode.parentNode.id);
document.getElementById(PMPopup).style.display ='none';
}
And in loggedin.html add the following where you want the PopUps to be.
<input name="TempMsgHolder" id="TempMsgHolder" type="hidden" value="" />
<input name="MyUserName" id="MyUserName" type="hidden" value="" />
<div class="PopUpHolder" id="PopUpHolder"></div>
Make sure and add a link to jQuery library in the head of loggedin.html