/**
* 更新公聊记录
*
* @param nodParent - 父节点
* @param jsonMessages - 要更新的公聊记录对象数组
* @param strIdPre - 节点的 id 属性前缀
* @param nodTempParent - 临时公聊记录的父节点
* @param lngMaxId - 要被删除的临时公聊记录的最大 id,为空 时不移除临时公聊记录
*/
function refreshPublicMessages(nodParent, jsonMessages, strIdPre, nodTempParent, lngMaxId) {
if (isNotEmptyArray(jsonMessages)) {
addChildNodes(nodParent, createMessageNodes(jsonMessages, strIdPre));
if (lngMaxId != null) { // 移除临时增加的公聊记录
delTempPublicMessages(nodTempParent, strIdPre, lngMaxId);
}
}
}
/**
* 移除临时增加的公聊记录
*
* @param nodParent - 父节点
* @param strIdPre - li 元素的 id 属性前缀
* @param maxId - 要删除到的最大的 id
*/
function delTempPublicMessages(nodParent, strIdPre, maxId) {
var element;
while(nodParent.getElementsByTagName("li").length > 0) {
element = nodParent.getElementsByTagName("li")[0];
if (parseInt(element.getAttribute("id").substr(strIdPre.length)) <= maxId) {
nodParent.removeChild(element);
} else {
return;
}
}
}
/**
* 更新私聊记录
*
* @param nodParent - 父节点
* @param jsonMessages - 要更新的私聊记录对象数组
* @param strIdPre - 节点的 id 属性前缀
* @param nodTempParent - 临时公聊记录的父节点
* @param lngMaxId - 要被删除的临时公聊记录的最大 id,为空 时不移除临时公聊记录
*/
function refreshPrivateMessages(nodParent, jsonMessages, strIdPre, nodTempParent, lngMaxId) {
if (!isNotEmptyArray(jsonMessages)) {
return;
}
if (nodTempParent.getElementsByTagName("li").length < 1) {
addChildNodes(nodParent, createMessageNodes(jsonMessages, strIdPre));
} else {
var jsonMessage, objTemp, lngTemp;
for(var i = 0; i < jsonMessages.length; i++) {
jsonMessage = jsonMessages[i];
while(nodTempParent.getElementsByTagName("li").length > 0) {
objTemp = nodTempParent.getElementsByTagName("li")[0];
lngTemp = parseInt(objTemp.getAttribute("id").substr(strIdPre.length));
if (lngTemp < jsonMessage.id) {
nodTempParent.removeChild(objTemp);
nodParent.appendChild(objTemp);
} else {
break;
}
}
nodParent.appendChild(createMessageNode(jsonMessage, strIdPre));
}
while(nodTempParent.getElementsByTagName("li").length > 0) {
objTemp = nodTempParent.getElementsByTagName("li")[0];
lngTemp = parseInt(objTemp.getAttribute("id").substr(strIdPre.length));
if (lngTemp < lngMaxId) {
nodTempParent.removeChild(objTemp);
nodParent.appendChild(objTemp);
} else {
break;
}
}
}
}
/**
* 创建聊天记录对象数组对应的节点数组
*
* @param jsonMessages - 聊天记录 Json 数组对象
* @param strIdPre - 节点的 id 属性前缀
*/
function createMessageNodes(jsonMessages, strIdPre) {
var arrLi = new Array(jsonMessages.length);
for(var i = 0; i < jsonMessages.length; i++) {
arrLi[i] = createMessageNode(jsonMessages[i], strIdPre);
}
return arrLi;
}
/**
* 创建聊天记录对象对应的节点
*
* @param jsonMessage - 聊天记录 Json 对象
* @param strIdPre - 节点的 id 属性前缀
*/
function createMessageNode(jsonMessage, strIdPre) {
var nodeLi, nodeSpan, strHref, strName;
var strId = ((strIdPre != null) ? strIdPre : "") + jsonMessage.id;
if("SYSTEM" == jsonMessage.senderId) {
nodeLi = createSystemMessageNode(strId, jsonMessage.create, jsonMessage.content);
return nodeLi;
}
nodeLi = document.createElement("li");
nodeLi.setAttribute("id", strId);
nodeSpan = document.createElement("span");
nodeSpan.setAttribute("class", "gry f12");
nodeSpan.setAttribute("className", "gry f12");
if (isNotBlankStr(jsonMessage.create)) {
nodeSpan.appendChild(document.createTextNode("[" + jsonMessage.create + "] "));
}
nodeLi.appendChild(nodeSpan);
nodeLi.appendChild(document.createTextNode(" "));
strHref = "javascript:addReceiver('" + jsonMessage.senderId + "', '" + jsonMessage.senderName + "')";
strName = jsonMessage.senderName;
if("COMP" == jsonMessage.senderType) {
strName = strName + "(主持人)";
} else if("VIP" == jsonMessage.senderType) {
strName = strName + "(嘉宾)";
}
nodeLi.appendChild(createANode(strHref, strName));
nodeLi.appendChild(document.createTextNode(" 对 "));
strHref = "javascript:addReceiver('" + jsonMessage.receiverId + "', '" + jsonMessage.receiverName + "')";
strName = jsonMessage.receiverName;
if("COMP" == jsonMessage.receiverType) {
strName = strName + "(主持人)";
} else if("VIP" == jsonMessage.receiverType) {
strName = strName + "(嘉宾)";
}
nodeLi.appendChild(createANode(strHref, strName));
nodeLi.appendChild(document.createTextNode(" 说："));
nodeSpan = document.createElement("span");
if(navigator.appName == "Microsoft Internet Explorer") {
nodeSpan.style.cssText = jsonMessage.style;
} else {
nodeSpan.setAttribute("style", jsonMessage.style);
}
nodeSpan.appendChild(document.createTextNode(jsonMessage.content));
nodeLi.appendChild(nodeSpan);
if (isNotBlankStr(jsonMessage.img)) {
nodeLi.appendChild(document.createTextNode(" "));
var nodeImg = document.createElement("img");
nodeImg.setAttribute("src", jsonMessage.img);
nodeImg.setAttribute("height", "25");
nodeImg.setAttribute("width", "25");
nodeImg.setAttribute("align", "absmiddle");
nodeLi.appendChild(nodeImg);
}
return nodeLi;
}
/**
* 创建系统公告节点
*
* @param strId - 节点的 id 属性
* @param strContent - 公告时间
* @param strContent - 公告内容
*/
function createSystemMessageNode(strId, strTime, strContent) {
var nodeLi = document.createElement("li");
nodeLi.setAttribute("id", strId);
var nodeSpan = document.createElement("span");
nodeSpan.setAttribute("class", "gry f12");
nodeSpan.setAttribute("className", "gry f12");
nodeSpan.appendChild(document.createTextNode("[" + strTime + "] " + strContent));
nodeLi.appendChild(nodeSpan);
return nodeLi;
}
/*--------------------------------------------------------------------------*/
/**
* 更新在线用户列表，在线用户总数，接收人列表昵称
*
* @param nodParent - 在线用户列表节点
* @param jsonOnlines - 在线用户 Json 数组对象
* @param strSelf - 当前用户ID
* @param nodCount - 在线用户总数节点
* @param nodReceiver - 接收人列表节点
*/
function refreshOnlines(nodParent, jsonOnlines, strSelf, nodCount, nodReceiver) {
delAllChildNodes(nodParent);
if (!isNotEmptyArray(jsonOnlines)) {
replaceText(nodCount, 0);
return;
} else {
replaceText(nodCount, jsonOnlines.length);
}
var jsonOnline;
for(var i = 0; i < jsonOnlines.length; i++) {
jsonOnline = jsonOnlines[i];
nodParent.appendChild(createOnlineNode(jsonOnline, strSelf));
for(var j = 1; j < nodReceiver.length; j++) { // 更新接收人列表中的昵称
if ((nodReceiver[j].value == jsonOnline.guestId) && (nodReceiver[j].innerHTML != jsonOnline.nickname)) {
nodReceiver[j].innerHTML = jsonOnline.nickname;
break;
}
}
}
}
/**
* 创建在线用户对象对应的节点
* @param jsonOnline - 在线用户 Json 对象
* @param strSelf - 当前用户ID
* @return node
*/
function createOnlineNode(jsonOnline, strSelf) {
var nodeLi = document.createElement("li");
nodeLi.appendChild(document.createTextNode("["));
var strHref = "javascript:addReceiver('" + jsonOnline.guestId + "', '" + jsonOnline.nickname + "')";
nodeLi.appendChild(createANode(strHref, abbreviate(jsonOnline.nickname, 10), jsonOnline.nickname));
nodeLi.appendChild(document.createTextNode("]"));
if ("COMP" == jsonOnline.guestType) { // 主持人
nodeLi.appendChild(document.createTextNode("(主持人)"));
} else if ("VIP" == jsonOnline.guestType) { // 嘉宾
nodeLi.appendChild(document.createTextNode("(嘉宾)"));
} else if (strSelf == jsonOnline.guestId){ // 当前用户
var nodeSpan = document.createElement("span");
nodeSpan.setAttribute("class", "red");
nodeSpan.setAttribute("className", "red");
nodeSpan.appendChild(document.createTextNode("<="));
nodeLi.appendChild(nodeSpan);
}
return nodeLi;
}
/*--------------------------------------------------------------------------*/
/**
* 验证聊天内容有效性
* @param strContent - 内容
* @return boolean
*/
function validateMessage(strContent) {
if (!isNotBlankStr(strContent)) {
alert("发言内容不能为空!");
return false;
}
if (strContent.length > 800) {
alert("发言内容长度不能超过 800 !");
return false;
}
if (/[<>&%]/.test(strContent)) {
alert("发言内容中不能包含 <,>,&,%");
return false;
}
return true;
}
/**
* 验证昵称有效性
* @param strNickname - 昵称
* @return boolean
*/
function validateNickname(strNickname) {
if (!isNotBlankStr(strNickname)) {
alert("昵称不能为空!");
return false;
}
if (strNickname.length > 15) {
alert("昵称长度不能超过 15 !");
return false;
}
if (!/^[\u4e00-\u9fa5\w]*$/.test(strNickname)) {
alert("昵称只能由 中文,A-Z,a-z,0-9,_ 组成！");
return false;
}
return true;
}
/**
* 验证公告有效性
* @param strBulletin - 公告
* @return boolean
*/
function validateBulletin(strBulletin) {
if (isNotBlankStr(strBulletin)) {
if (strBulletin.length > 100) {
alert("公告长度不能超过 100 !");
return false;
}
if (/[<>%&]/.test(strBulletin)) {
alert("公告中不能包含 <,>,%,&");
return false;
}
}
return true;
}
/**
* 验证嘉宾有效性
* @param strVip - 嘉宾
* @return boolean
*/
function validateVip(strVip) {
if (isNotBlankStr(strVip)) {
if (strVip.length > 120) {
alert("嘉宾长度不能超过 120 !");
return false;
}
if(!/^(\w)+(\|(\w)+)*$/.test(strVip)) {
alert("嘉宾是中文站会员ID，由 | 分割，格式参考 loginId1|loginId2 ！");
return false;
}
if(splitStr(strVip, "|").length > 3) {
alert("每个聊天室嘉宾不能超过 3 个！");
return false;
}
}
return true;
}
