var arrMsgBuffer = new Array(); var msgTime = 1000; var msg_timer; var iMsgLastUpdateId = 0; var strMsgDocList = ""; var msg_curr_show_content_id = ""; var msg_curr_show_content_type = ""; var msg_my_id = "sys_message"; /* 初始化消息模块 msgInitId:上次消息的最大id */ function msg_init(msgInitId, time = 3) { iMsgLastUpdateId = msgInitId; msgTime = time * 1000; } function msg_start() { msg_send(); } function msg_stop() { clearTimeout(msg_timer) } function msg_push(type, data, docid, time, book = 0, paragraph = 0) { /* data.type data.data data.doc */ var newMessage = { type: type, data: data, docid: docid, time: time, book: book, para: paragraph }; arrMsgBuffer.push(newMessage); var obj = new Object(); obj.id = 0; obj.sender = getCookie("username"); obj.type = newMessage.type; obj.docid = newMessage.docid; obj.time = newMessage.time / 5000; obj.read = 1; obj.data = JSON.parse(newMessage.data); //doc_msg_push(obj); msg_show_content(msg_curr_show_content_type, msg_curr_show_content_id); } function msg_reload() { iMsgLastUpdateId = 1; } function msg_send() { $("#net_up").html("▲"); if (arrMsgBuffer.length > 0) { var operation = "send"; } else { var operation = "get"; } $.post("message.php", { op: operation, lastid: iMsgLastUpdateId, doclist: strMsgDocList, data: JSON.stringify(arrMsgBuffer) }, function (data, status) { let xmlText = data; console.log("receive mseeage:" + data); let msgXml; if (window.DOMParser) { parser = new DOMParser(); msgXml = parser.parseFromString(xmlText, "text/xml"); } else { // Internet Explorer msgXml = new ActiveXObject("Microsoft.XMLDOM"); msgXml.async = "false"; msgXml.loadXML(xmlText); } if (msgXml == null) { alert("error:can not load Project. xml obj is null."); return; } let arrMsg = msgXml.getElementsByTagName("msg"); var arrWordNewMsg = new Array(); for (var x = 0; x < arrMsg.length; x++) { switch (getNodeText(arrMsg[x], "type")) { case "maxid": iMsgLastUpdateId = getNodeText(arrMsg[x], "data"); doc_head("msg_db_max_id", iMsgLastUpdateId); console.log("iMsgLastUpdateId:" + iMsgLastUpdateId); break; default: if (gXmlBookDataMsg) { var obj = new Object(); obj.id = getNodeText(arrMsg[x], "id"); obj.sender = getNodeText(arrMsg[x], "sender"); obj.type = getNodeText(arrMsg[x], "type"); obj.docid = getNodeText(arrMsg[x], "docid"); obj.time = getNodeText(arrMsg[x], "time"); obj.read = getNodeText(arrMsg[x], "read"); let objData = getNodeText(arrMsg[x], "data"); try { obj.data = JSON.parse(objData); } catch (e) { obj.data = null; console.error("err:message.js-msg_send" + e + "data:" + objData); break; } //尝试用此消息更新文档数据 if (msg_apply_data(obj)) { //如果已经使用此消息,xml标记为已读 setNodeText(arrMsg[x], "read", "2"); } doc_msg_push(obj); msg_show_content(msg_curr_show_content_type, msg_curr_show_content_id); switch (obj.type) { case "1": //wbw var iFind = false; for (var iWordId = 0; iWordId < arrWordNewMsg.length; iWordId++) { if (arrWordNewMsg[iWordId] == obj.data.id) { iFind = true; break; } } if (!iFind) { arrWordNewMsg.push(obj.data.id); } break; case "2": break; } //gXmlBookDataMsg.appendChild(arrMsg[x].cloneNode(true)); } break; } } for (let i = 0; i < arrWordNewMsg.length; i++) { updataWordHeadById(arrWordNewMsg[i]); } refreshNoteNumber(); msg_set_tool_bar_msg_counter(); msg_update_msg_list(); $("#net_down").html(" "); }); $("#net_up").html(" "); $("#net_down").html("▼"); arrMsgBuffer = new Array(); msg_timer = setTimeout("msg_send()", msgTime) } function msg_new_msg_id_push() { } function msg_stop() { } function msg_read(msg_obj, status = null) { if (msg_obj) { if (status) { var oldStatus = msg_obj.read; msg_obj.read = status; var xMsg = gXmlBookDataMsg.getElementsByTagName("msg"); for (var i = 0; i < xMsg.length; i++) { if (getNodeText(xMsg[i], "id") == msg_obj.id) { setNodeText(xMsg[i], "read", status); break; } } return (oldStatus); } else { return (msg_obj.read); } } } //将消息数据应用(apply)到文档 function msg_apply_data(obj) { if (obj.sender == getCookie("username")) { //忽略自己的消息 msg_read(obj, 1);//设置为已读 return (true); } doc_info.sendmsg = false;//不发送消息 try { switch (obj.type) { case "1"://逐词译 let wIndex = getWordIndex(obj.data.id) if (wIndex >= 0) { let xAllWord = gXmlBookDataBody.getElementsByTagName("word"); let xWord = xAllWord[wIndex]; let sReal = getNodeText(xWord, "real"); let wordStatus = parseInt(getNodeText(xWord, "status")); let wordBodyChange = false; let wordHeadChange = false; let wordNoteChange = false; let wordRelationChange = false; let newWord = new Object(); newWord.real = sReal; newWord.vaild = false; if ((wordStatus != 7 && wordStatus != 5) && obj.sender != getCookie("username")) { msg_read(obj, 2); if (obj.data.real != null && obj.data.real != "") { //setNodeText(xWord,"real",obj.data.real); //newWord.real = obj.data.real; //wordHeadChange=true; } if (obj.data.pali != null) { //setNodeText(xWord,"pali",obj.data.pali); //wordHeadChange=true; } if (obj.data.mean != null) { setNodeText(xWord, "mean", obj.data.mean); newWord.mean = obj.data.mean; newWord.vaild = true; wordBodyChange = true; } if (obj.data.org != null) { setNodeText(xWord, "org", obj.data.org); newWord.parts = obj.data.org; newWord.vaild = true; wordBodyChange = true; } if (obj.data.om != null) { setNodeText(xWord, "om", obj.data.om); newWord.partmean = obj.data.om; newWord.vaild = true; wordBodyChange = true; } if (obj.data.case != null) { setNodeText(xWord, "case", obj.data.case); newWord.case = obj.data.case; newWord.vaild = true; wordBodyChange = true; } if (obj.data.parent != null) { setNodeText(xWord, "parent", obj.data.parent); } if (obj.data.note != null) { setNodeText(xWord, "note", obj.data.note); wordNoteChange = true; } if (obj.data.rela != null) { //setNodeText(xWord,"rela",decodeURI(obj.data.rela)); setNodeText(xWord, "rela", obj.data.rela); wordRelationChange = true; } if (obj.data.bmc != null) { setNodeText(xWord, "bmc", obj.data.bmc); wordBodyChange = true; } if (obj.data.bmt != null) { setNodeText(xWord, "bmt", obj.data.bmt); } if (obj.data.lock != null) { setNodeText(xWord, "lock", obj.data.lock); wordBodyChange = true; } setNodeText(xWord, "status", 6); } if (wordHeadChange) { updataWordHeadByIndex(wIndex); } if (wordBodyChange) { modifyWordDetailByWordIndex(wIndex); } if (wordNoteChange || wordRelationChange) { //updateWordNote(xWord); refreshWordNoteDiv(xWord.parentNode.parentNode); } if (newWord.vaild) { if (!mDict[sReal]) { mDict[sReal] = new Array(); } let isExsit = false; for (let x in mDict[sReal]) { if (mDict[sReal].mean && mDict[sReal].mean == newWord.mean && mDict[sReal].parts && mDict[sReal].parts == newWord.parts && mDict[sReal].partmean && mDict[sReal].mean == newWord.partmean && mDict[sReal].case && mDict[sReal].case == newWord.case) { isExsit = true; } } if (!isExsit) { mDict[sReal].push(newWord); } } } break; case "2"://译文 let tranBlock = doc_tran("#" + obj.data.id); if (tranBlock == null) { tranBlock = doc_tran("#" + obj.data.id, true); } if (tranBlock) { if (tranBlock.text(obj.data.begin, obj.data.end, "status") != 7) { msg_read(obj, 2);//设置为自动采纳 console.log("句子 自动采纳"); tranBlock.text(obj.data.begin, obj.data.end, "text", obj.data.text); tranBlock.text(obj.data.begin, obj.data.end, "status", 5); sen_save(tranBlock.info("id"), obj.data.begin, obj.data.end, obj.data.text); } } break; } } catch (e) { console.error(e.message); console.error(e.stack); } doc_info.sendmsg = true;//发送消息 if (obj.read > 0) { return (true); } else { return (false); } } function msg_word_msg_num(wid) { var iMsg = 0; for (var i = 0; i < gDocMsgList.length; i++) { if (gDocMsgList[i].type == 1) { if (gDocMsgList[i].data.id == wid && gDocMsgList[i].read == 0) { iMsg++; } } } return (iMsg); } function msg_set_tool_bar_msg_counter() { var iMsg = 0; for (var i = 0; i < gDocMsgList.length; i++) { if (gDocMsgList[i].read == 0) { iMsg++; } } if (iMsg == 0) { $("#icon_notify_" + msg_my_id).html(""); $("#icon_notify_" + msg_my_id).hide(); } else { if (iMsg > 100) { iMsg = "+99"; } $("#icon_notify_" + msg_my_id).html(iMsg.toString()); $("#icon_notify_" + msg_my_id).show(); } } function time_standardize(date) { var today_date = new Date(); var Local_time = date.toLocaleTimeString(); //將時間去掉秒的信息 if (Local_time && Local_time.split(":").length == 3) { var Local_time_string = Local_time.split(":")[0] + ":" + Local_time.split(":")[1]; Local_time_string += Local_time.split(":")[2].slice(2); } else { var Local_time_string = d.toLocaleTimeString() } if (date.toLocaleDateString() == today_date.toLocaleDateString()) {//如果是今天的消息,只显示时间 return (Local_time_string); } else {//如果不是今天的消息,只显示日期 return (date.toLocaleDateString()); } } //显示消息内容 function msg_show_content(type, id) { if (type == "" || id == "") { return; } let arrid; let sen_begin, sen_end; type = parseInt(type); if (type == 2) { arrid = id.split("#"); id = arrid[0]; sen_begin = arrid[1]; sen_end = arrid[2]; } msg_curr_show_content_id = id; msg_curr_show_content_type = type; var iMsg = 0; var outHtml = ""; var iLastTime = 0; for (var i = 0; i < gDocMsgList.length; i++) { let isFound = false; switch (type) { case 1: if (gDocMsgList[i].type == type && gDocMsgList[i].data.id == id) { isFound = true; } break; case 2: if (gDocMsgList[i].type == type && gDocMsgList[i].data.id == id && gDocMsgList[i].data.begin == sen_begin && gDocMsgList[i].data.end == sen_end) { isFound = true; } break; } if (isFound) { iMsg++; if (gDocMsgList[i].read == 0) { //如果未读,设置为已读 msg_read(gDocMsgList[i], 1); } //三分钟之内的消息只显示一个时间标记 if (gDocMsgList[i].time - iLastTime > 60 * 3) { var d = new Date() d.setTime(gDocMsgList[i].time * 1000); //var Local_date=d.toLocaleDateString().split("/"); var time_standardize_string = time_standardize(d); outHtml += "