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 = 0, book = 0, paragraph = 0) { /* data.type data.data data.doc */ let send_time = time; if (time == 0) { let d = new Date(); send_time = d.getTime(); } var newMessage = { type: type, data: data, docid: docid, time: send_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(""); $("#msg_tool_bar").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) { console.error("error:can not load Project. xml obj is null."); return; } let arrMsg = msgXml.getElementsByTagName("msg"); var arrWordNewMsg = new Array(); //开始一个事务,关闭自动提交 doc_beginTransaction(); for (var x = 0; x < arrMsg.length; x++) { switch (getNodeText(arrMsg[x], "type")) { case "maxid": iMsgLastUpdateId = getNodeText(arrMsg[x], "data"); //TO DO 用local storage解决 //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; } } //提交一个事务 doc_commit(); user_wbw_commit(); 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(" "); $("#msg_tool_bar").html(""); } ); $("#net_up").html(""); $("#net_down").html(""); $("#msg_tool_bar").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) { let oldStatus = msg_obj.read; msg_obj.read = status; for (let i = 0; i < gDocMsgList.length; i++) { if (gDocMsgList[i].data.id == msg_obj.id) { gDocMsgList[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; let wordChanged = 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; wordChanged = true; } if (obj.data.org != null) { setNodeText(xWord, "org", obj.data.org); newWord.parts = obj.data.org; newWord.vaild = true; wordBodyChange = true; wordChanged = true; } if (obj.data.om != null) { setNodeText(xWord, "om", obj.data.om); newWord.partmean = obj.data.om; newWord.vaild = true; wordBodyChange = true; wordChanged = true; } if (obj.data.case != null) { setNodeText(xWord, "case", obj.data.case); newWord.case = obj.data.case; newWord.vaild = true; wordBodyChange = true; wordChanged = true; } if (obj.data.parent != null) { setNodeText(xWord, "parent", obj.data.parent); wordChanged = true; } if (obj.data.note != null) { setNodeText(xWord, "note", obj.data.note); wordNoteChange = true; wordChanged = true; } if (obj.data.rela != null) { //setNodeText(xWord,"rela",decodeURI(obj.data.rela)); setNodeText(xWord, "rela", obj.data.rela); wordRelationChange = true; wordChanged = true; } if (obj.data.bmc != null) { setNodeText(xWord, "bmc", obj.data.bmc); wordBodyChange = true; wordChanged = true; } if (obj.data.bmt != null) { setNodeText(xWord, "bmt", obj.data.bmt); wordChanged = true; } if (obj.data.lock != null) { setNodeText(xWord, "lock", obj.data.lock); wordBodyChange = true; wordChanged = true; } if (wordChanged) { setNodeText(xWord, "status", 6); //提交用户逐词解析数据库 user_wbw_push_word(obj.data.id); } } 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 book = obj.data.book; let para = obj.data.para; let begin = obj.data.begin; let end = obj.data.end; $("[pcds='sent-net-all'][book='" + book + "'][para='" + para + "'][begin='" + begin + "']").html( obj.data.text ); $("[pcds='sent-net-div'][book='" + book + "'][para='" + para + "'][begin='" + begin + "']") .find(".author") .html(obj.sender); 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) { if (gDocMsgList == null) { return; } 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() { if (gDocMsgList == null) { return; } 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 if (date.toLocaleDateString().slice(0, 5) == today_date.toLocaleDateString().slice(0, 5)) { //如果是今年但非今天的消息,只显示月日 var date_length = date.toLocaleDateString().length; return date.toLocaleDateString().slice(5, date_length); } else { //如果不是今年的消息,显示年月日 return date.toLocaleDateString(); } } //显示消息内容 function msg_show_content(type, id) { if (gDocMsgList == null) { return; } 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 += "