message.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. var arrMsgBuffer = new Array();
  2. var msgTime=1000;
  3. var msg_timer;
  4. var iMsgLastUpdateId=0;
  5. var strMsgDocList="";
  6. var msg_curr_show_content_id = "";
  7. var msg_curr_show_content_type = "";
  8. var msg_my_id="sys_message";
  9. /*
  10. 初始化消息模块
  11. msgInitId:上次消息的最大id
  12. */
  13. function msg_init(msgInitId,time=3){
  14. iMsgLastUpdateId=msgInitId;
  15. msgTime=time*1000;
  16. }
  17. function msg_start(){
  18. msg_send();
  19. }
  20. function msg_stop(){
  21. clearTimeout(msg_timer)
  22. }
  23. function msg_push(type,data,docid,time,book=0,paragraph=0){
  24. /*
  25. data.type
  26. data.data
  27. data.doc
  28. */
  29. var newMessage={
  30. type:type,
  31. data:data,
  32. docid:docid,
  33. time:time,
  34. book:book,
  35. para:paragraph
  36. };
  37. arrMsgBuffer.push(newMessage);
  38. var obj = new Object();
  39. obj.id=0;
  40. obj.sender=getCookie("username");
  41. obj.type=newMessage.type;
  42. obj.docid=newMessage.docid;
  43. obj.time=newMessage.time/5000;
  44. obj.read=1;
  45. obj.data=JSON.parse(newMessage.data);
  46. //doc_msg_push(obj);
  47. msg_show_content(msg_curr_show_content_type,msg_curr_show_content_id);
  48. }
  49. function msg_reload(){
  50. iMsgLastUpdateId=1;
  51. }
  52. function msg_send(){
  53. $("#net_up").html("▲");
  54. if(arrMsgBuffer.length>0){
  55. var operation="send";
  56. }
  57. else{
  58. var operation="get";
  59. }
  60. $.post("message.php",
  61. {
  62. op:operation,
  63. lastid:iMsgLastUpdateId,
  64. doclist:strMsgDocList,
  65. data:JSON.stringify(arrMsgBuffer)
  66. },
  67. function(data,status){
  68. let xmlText = data;
  69. console.log("receive mseeage:"+data);
  70. let msgXml;
  71. if (window.DOMParser){
  72. parser=new DOMParser();
  73. msgXml=parser.parseFromString(xmlText,"text/xml");
  74. }
  75. else{ // Internet Explorer
  76. msgXml=new ActiveXObject("Microsoft.XMLDOM");
  77. msgXml.async="false";
  78. msgXml.loadXML(xmlText);
  79. }
  80. if (msgXml == null){
  81. alert("error:can not load Project. xml obj is null.");
  82. return;
  83. }
  84. let arrMsg = msgXml.getElementsByTagName("msg");
  85. var arrWordNewMsg=new Array();
  86. for(var x=0;x<arrMsg.length;x++){
  87. switch(getNodeText(arrMsg[x],"type")){
  88. case "maxid":
  89. iMsgLastUpdateId=getNodeText(arrMsg[x],"data");
  90. doc_head("msg_db_max_id",iMsgLastUpdateId);
  91. console.log("iMsgLastUpdateId:"+iMsgLastUpdateId);
  92. break;
  93. default:
  94. if(gXmlBookDataMsg){
  95. var obj = new Object();
  96. obj.id=getNodeText(arrMsg[x],"id");
  97. obj.sender=getNodeText(arrMsg[x],"sender");
  98. obj.type=getNodeText(arrMsg[x],"type");
  99. obj.docid=getNodeText(arrMsg[x],"docid");
  100. obj.time=getNodeText(arrMsg[x],"time");
  101. obj.read=getNodeText(arrMsg[x],"read");
  102. let objData=getNodeText(arrMsg[x],"data");
  103. try{
  104. obj.data=JSON.parse(objData);
  105. }
  106. catch(e){
  107. obj.data=null;
  108. console.error("err:message.js-msg_send"+e+"data:"+objData);
  109. break;
  110. }
  111. //尝试用此消息更新文档数据
  112. if(msg_apply_data(obj)){
  113. //如果已经使用此消息,xml标记为已读
  114. setNodeText(arrMsg[x],"read","2");
  115. }
  116. doc_msg_push(obj);
  117. msg_show_content(msg_curr_show_content_type,msg_curr_show_content_id);
  118. switch(obj.type){
  119. case 1: //wbw
  120. var iFind=false;
  121. for(var iWordId=0;iWordId<arrWordNewMsg.length;iWordId++){
  122. if(arrWordNewMsg[iWordId]==obj.data.id){
  123. iFind=true;
  124. break;
  125. }
  126. }
  127. if(!iFind){
  128. arrWordNewMsg.push(obj.data.id);
  129. }
  130. break;
  131. case 2:
  132. break;
  133. }
  134. gXmlBookDataMsg.appendChild(arrMsg[x].cloneNode(true));
  135. }
  136. break;
  137. }
  138. }
  139. for(let i=0;i<arrWordNewMsg.length;i++){
  140. updataWordHeadById(arrWordNewMsg[i]);
  141. }
  142. refreshNoteNumber();
  143. msg_set_tool_bar_msg_counter();
  144. msg_update_msg_list();
  145. $("#net_down").html(" ");
  146. });
  147. $("#net_up").html(" ");
  148. $("#net_down").html("▼");
  149. arrMsgBuffer = new Array();
  150. msg_timer=setTimeout("msg_send()",msgTime)
  151. }
  152. function msg_new_msg_id_push(){
  153. }
  154. function msg_stop(){
  155. }
  156. function msg_read(msg_obj,status=null){
  157. if(msg_obj){
  158. if(status){
  159. var oldStatus=msg_obj.read;
  160. msg_obj.read=status;
  161. var xMsg=gXmlBookDataMsg.getElementsByTagName("msg");
  162. for(var i=0;i<xMsg.length;i++){
  163. if(getNodeText(xMsg[i],"id")==msg_obj.id){
  164. setNodeText(xMsg[i],"read",status);
  165. break;
  166. }
  167. }
  168. return(oldStatus);
  169. }
  170. else{
  171. return(msg_obj.read);
  172. }
  173. }
  174. }
  175. //将消息数据应用(apply)到文档
  176. function msg_apply_data(obj){
  177. doc_info.sendmsg = false;//不发送消息
  178. try{
  179. switch(obj.type){
  180. case "1"://逐词译
  181. let wIndex=getWordIndex(obj.data.id)
  182. if(wIndex>=0){
  183. let xAllWord = gXmlBookDataBody.getElementsByTagName("word");
  184. let xWord=xAllWord[wIndex];
  185. let sReal = getNodeText(xWord,"real");
  186. let wordStatus=editor_word_status(xWord);
  187. let wordBodyChange=false;
  188. let wordHeadChange=false;
  189. let wordNoteChange=false;
  190. let wordRelationChange=false;
  191. let newWord = new Object();
  192. newWord.real = sReal;
  193. newWord.vaild=false;
  194. if((wordStatus!=7 && wordStatus!=5) || obj.sender==getCookie("username"))
  195. {
  196. msg_read(obj,2);
  197. if(obj.data.real!=null && obj.data.real!=""){
  198. //setNodeText(xWord,"real",obj.data.real);
  199. //newWord.real = obj.data.real;
  200. //wordHeadChange=true;
  201. }
  202. if(obj.data.pali!=null){
  203. //setNodeText(xWord,"pali",obj.data.pali);
  204. //wordHeadChange=true;
  205. }
  206. if(obj.data.mean!=null){
  207. setNodeText(xWord,"mean",obj.data.mean);
  208. newWord.mean = obj.data.mean;
  209. newWord.vaild=true;
  210. wordBodyChange=true;
  211. }
  212. if(obj.data.org!=null){
  213. setNodeText(xWord,"org",obj.data.org);
  214. newWord.parts = obj.data.org;
  215. newWord.vaild=true;
  216. wordBodyChange=true;
  217. }
  218. if(obj.data.om!=null){
  219. setNodeText(xWord,"om",obj.data.om);
  220. newWord.partmean = obj.data.om;
  221. newWord.vaild=true;
  222. wordBodyChange=true;
  223. }
  224. if(obj.data.case!=null){
  225. setNodeText(xWord,"case",obj.data.case);
  226. newWord.case = obj.data.case;
  227. newWord.vaild=true;
  228. wordBodyChange=true;
  229. }
  230. if(obj.data.parent!=null){
  231. setNodeText(xWord,"parent",obj.data.parent);
  232. }
  233. if(obj.data.note!=null){
  234. setNodeText(xWord,"note",obj.data.note);
  235. wordNoteChange=true;
  236. }
  237. if(obj.data.rela!=null){
  238. //setNodeText(xWord,"rela",decodeURI(obj.data.rela));
  239. setNodeText(xWord,"rela",obj.data.rela);
  240. wordRelationChange=true;
  241. }
  242. if(obj.data.bmc!=null){
  243. setNodeText(xWord,"bmc",obj.data.bmc);
  244. wordBodyChange=true;
  245. }
  246. if(obj.data.bmt!=null){
  247. setNodeText(xWord,"bmt",obj.data.bmt);
  248. }
  249. if(obj.data.lock!=null){
  250. setNodeText(xWord,"lock",obj.data.lock);
  251. wordBodyChange=true;
  252. }
  253. editor_word_status(xAllWord[wIndex],6);
  254. }
  255. if(wordHeadChange){
  256. updataWordHeadByIndex(wIndex);
  257. }
  258. if(wordBodyChange){
  259. modifyWordDetailByWordIndex(wIndex);
  260. }
  261. if(wordNoteChange ||wordRelationChange){
  262. //updateWordNote(xWord);
  263. refreshWordNoteDiv(xWord.parentNode.parentNode);
  264. }
  265. if(newWord.vaild){
  266. if(!mDict[sReal]){
  267. mDict[sReal] = new Array();
  268. }
  269. let isExsit=false;
  270. for(let x in mDict[sReal]){
  271. if(mDict[sReal].mean && mDict[sReal].mean==newWord.mean &&
  272. mDict[sReal].parts && mDict[sReal].parts==newWord.parts &&
  273. mDict[sReal].partmean && mDict[sReal].mean==newWord.partmean &&
  274. mDict[sReal].case && mDict[sReal].case==newWord.case ){
  275. isExsit = true;
  276. }
  277. }
  278. if(!isExsit){
  279. mDict[sReal].push(newWord);
  280. }
  281. }
  282. }
  283. break;
  284. case "2"://译文
  285. let tranBlock = doc_tran("#"+obj.data.id);
  286. if(tranBlock==null){
  287. tranBlock = doc_tran("#"+obj.data.id,true);
  288. }
  289. if(tranBlock){
  290. //if(tranBlock.text(obj.data.begin,obj.data.end,"status")!=7 )
  291. {
  292. msg_read(obj,2);//设置为自动采纳
  293. console.log("句子 自动采纳");
  294. tranBlock.text(obj.data.begin,obj.data.end,"text",obj.data.text);
  295. tranBlock.text(obj.data.begin,obj.data.end,"status",5);
  296. sen_save(obj.data.id,obj.data.begin,obj.data.end,obj.data.text);
  297. }
  298. }
  299. break;
  300. }
  301. }
  302. catch(e){
  303. console.error(e.message);
  304. console.error(e.stack);
  305. }
  306. doc_info.sendmsg=true;//发送消息
  307. if(obj.read>0){
  308. return(true);
  309. }
  310. else{
  311. return(false);
  312. }
  313. }
  314. function msg_word_msg_num(wid){
  315. var iMsg=0;
  316. for(var i=0;i<gDocMsgList.length;i++){
  317. if(gDocMsgList[i].type==1){
  318. if(gDocMsgList[i].data.id==wid && gDocMsgList[i].read==0){
  319. iMsg++;
  320. }
  321. }
  322. }
  323. return(iMsg);
  324. }
  325. function msg_set_tool_bar_msg_counter(){
  326. var iMsg=0;
  327. for(var i=0;i<gDocMsgList.length;i++){
  328. if(gDocMsgList[i].read==0){
  329. iMsg++;
  330. }
  331. }
  332. if(iMsg==0){
  333. $("#icon_notify_"+msg_my_id).html("");
  334. $("#icon_notify_"+msg_my_id).hide();
  335. }
  336. else{
  337. if(iMsg>100){
  338. iMsg = "+99";
  339. }
  340. $("#icon_notify_"+msg_my_id).html(iMsg.toString());
  341. $("#icon_notify_"+msg_my_id).show();
  342. }
  343. }
  344. //显示消息内容
  345. function msg_show_content(type,id){
  346. if(type=="" || id==""){
  347. return;
  348. }
  349. let arrid;
  350. let sen_begin,sen_end;
  351. if(type==2){
  352. arrid = id.split("-");
  353. id=arrid[0];
  354. sen_begin=arrid[1];
  355. sen_end=arrid[2];
  356. }
  357. msg_curr_show_content_id=id;
  358. msg_curr_show_content_type=type;
  359. var iMsg=0;
  360. var outHtml="";
  361. var iLastTime=0;
  362. for(var i=0;i<gDocMsgList.length;i++){
  363. let isFound=false;
  364. switch(type){
  365. case 1:
  366. if(gDocMsgList[i].type==type && gDocMsgList[i].data.id==id){
  367. isFound=true;
  368. }
  369. break;
  370. case 2:
  371. if(gDocMsgList[i].type==type && gDocMsgList[i].data.id==id && gDocMsgList[i].data.begin==sen_begin && gDocMsgList[i].data.end==sen_end ){
  372. isFound=true;
  373. }
  374. break;
  375. }
  376. if(isFound){
  377. iMsg++;
  378. if(gDocMsgList[i].read==0){
  379. //如果未读,设置为已读
  380. msg_read(gDocMsgList[i],1);
  381. }
  382. //三分钟之内的消息只显示一个时间标记
  383. if(gDocMsgList[i].time-iLastTime>60*3){
  384. var d = new Date()
  385. d.setTime(gDocMsgList[i].time*1000);
  386. //var Local_date=d.toLocaleDateString().split("/");
  387. var Local_time=d.toLocaleTimeString();
  388. //將時間去掉秒的信息
  389. if(Local_time && Local_time.split(":").length==3){
  390. var Local_time_string=Local_time.split(":")[0]+":"+Local_time.split(":")[1];
  391. Local_time_string+=Local_time.split(":")[2].slice(2);
  392. }
  393. else{
  394. var Local_time_string=d.toLocaleTimeString()
  395. }
  396. outHtml+= "<div class='msgbox_time'><span>"+d.toLocaleDateString()+" "+Local_time_string+"</span></div>";//d.toLocaleeString()
  397. }
  398. iLastTime=gDocMsgList[i].time;
  399. var myName=getCookie("username");
  400. if(gDocMsgList[i].sender==myName){
  401. outHtml+= "<div class='msgbox_div'>";
  402. outHtml+= "<div class='msgbox_s'>";
  403. outHtml+= "<div class='head'><span>"+gDocMsgList[i].sender+"</span></div>";
  404. }
  405. else{
  406. outHtml+= "<div class='msgbox_r'>";
  407. outHtml+= "<div class='head'><span>"+gDocMsgList[i].sender+"</span><span>Apply</span></div>";
  408. }
  409. switch(parseInt(type) ){
  410. case 1:
  411. if(gDocMsgList[i].data.pali!=null){
  412. outHtml+= "<div>spell:<a onclick=\"fieldListChanged('"+id+"','pali','"+gDocMsgList[i].data.pali+"')\">"+gDocMsgList[i].data.pali+"</a></div>";
  413. }
  414. if(gDocMsgList[i].data.real!=null){
  415. outHtml+= "<div>real:<a onclick=\"fieldListChanged('"+id+"','real','"+gDocMsgList[i].data.real+"')\">"+gDocMsgList[i].data.real+"</a></div>";
  416. } if(gDocMsgList[i].data.mean!=null){
  417. outHtml+= "<div>mean:<a onclick=\"fieldListChanged('"+id+"','mean','"+gDocMsgList[i].data.mean+"')\">"+gDocMsgList[i].data.mean+"</a></div>";
  418. }
  419. if(gDocMsgList[i].data.org!=null){
  420. outHtml+= "<div>part:<a onclick=\"fieldListChanged('"+id+"','org','"+gDocMsgList[i].data.org+"')\">"+gDocMsgList[i].data.org+"</a></div>";
  421. }
  422. if(gDocMsgList[i].data.om!=null){
  423. outHtml+= "<div>part mean:<a onclick=\"fieldListChanged('"+id+"','om','"+gDocMsgList[i].data.om+"')\">"+gDocMsgList[i].data.om+"</a></div>";
  424. }
  425. if(gDocMsgList[i].data.case!=null){
  426. outHtml+= "<div>case:<a onclick=\"fieldListChanged('"+id+"','case','"+gDocMsgList[i].data.case+"')\">"+gDocMsgList[i].data.case+"</a></div>";
  427. }
  428. if(gDocMsgList[i].data.parent!=null){
  429. outHtml+= "<div>base:<a onclick=\"fieldListChanged('"+id+"','parent','"+gDocMsgList[i].data.parent+"')\">"+gDocMsgList[i].data.parent+"</a></div>";
  430. }
  431. if(gDocMsgList[i].data.note!=null){
  432. outHtml+= "<div>note:<a onclick=\"fieldListChanged('"+id+"','note','"+gDocMsgList[i].data.note+"')\">"+gDocMsgList[i].data.note+"</a></div>";
  433. }
  434. if(gDocMsgList[i].data.rela!=null){
  435. let strRelation=decodeURI(gDocMsgList[i].data.rela);
  436. outHtml+= "<div>Relation:<a onclick=\"fieldListChanged('"+id+"','rela','"+strRelation+"')\">";
  437. outHtml+= renderWordRelationByString("",strRelation,id);
  438. outHtml+= "</a></div>";
  439. }
  440. if(gDocMsgList[i].data.lock!=null){
  441. outHtml+= "<div>lock:<a onclick=\"fieldListChanged('"+id+"','lock','"+gDocMsgList[i].data.lock+"')\">"+gDocMsgList[i].data.lock+"</a></div>";
  442. }
  443. if(gDocMsgList[i].data.bmc!=null){
  444. outHtml+= "<div>Bookmark:<a onclick=\"fieldListChanged('"+id+"','bmc','"+gDocMsgList[i].data.bmc+"')\">"+gDocMsgList[i].data.bmc+"</a></div>";
  445. }
  446. if(gDocMsgList[i].data.bmt!=null){
  447. outHtml+= "<div>Bookmark:<a onclick=\"fieldListChanged('"+id+"','bmt','"+gDocMsgList[i].data.bmt+"')\">"+gDocMsgList[i].data.bmt+"</a></div>";
  448. }
  449. break;
  450. case 2:
  451. outHtml += "<div>sentence:<a onclick=\"setTranText('"+gDocMsgList[i].data.id+"','"+gDocMsgList[i].data.end+"','"+gDocMsgList[i].data.text+"')\">"+gDocMsgList[i].data.text+"</a></div>";
  452. break;
  453. }
  454. switch(gDocMsgList[i].read){
  455. case 1:
  456. break;
  457. case 2:
  458. outHtml+= "<div>已经自动采纳</div>";
  459. break;
  460. case 3:
  461. outHtml+= "<div>已被采纳</div>";
  462. break;
  463. }
  464. outHtml+= "</div></div>";
  465. }
  466. }
  467. $("#msg_panal_content").html(outHtml);
  468. switch(type){
  469. case 1:
  470. updataWordHeadById(id);
  471. var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
  472. var wordSpell = getNodeText(xAllWord[getWordIndex(id)],"real");
  473. var wordId = getNodeText(xAllWord[getWordIndex(id)],"id");
  474. wordSpell = "<a href='#w"+wordId+"'>" + wordSpell + "</a>";
  475. $("#msg_content_title").html(wordSpell);
  476. break;
  477. case 2:
  478. break;
  479. }
  480. msg_set_tool_bar_msg_counter();
  481. }
  482. //刷新消息列表
  483. function msg_update_msg_list(){
  484. let strHtml="";
  485. let msgList= new Array();
  486. for(var i=0;i<gDocMsgList.length;i++){
  487. switch(gDocMsgList[i].type){
  488. case 2:
  489. case 1:
  490. var iFind=_msg_find_id_in_list(msgList,gDocMsgList[i].data.id);
  491. if(iFind>=0){
  492. if(gDocMsgList[i].read==0){
  493. msgList[iFind].unread++;
  494. }
  495. msgList[iFind].counter++;
  496. msgList[iFind].newTime=gDocMsgList[i].time;
  497. msgList[iFind].sender = gDocMsgList[i].sender;
  498. }
  499. //没找到
  500. else{
  501. objMsg=new Object();
  502. objMsg.id=gDocMsgList[i].data.id;
  503. objMsg.type=gDocMsgList[i].type;
  504. if(gDocMsgList[i].read==0){
  505. objMsg.unread=1;
  506. }
  507. else{
  508. objMsg.unread=0;
  509. }
  510. objMsg.counter=1;
  511. objMsg.newTime=gDocMsgList[i].time;
  512. objMsg.sender = gDocMsgList[i].sender;
  513. msgList.push(objMsg);
  514. }
  515. break;
  516. }
  517. }
  518. strHtml+="<ul class='msg_list'>";
  519. msgList.sort(sortNumber);
  520. for(var j=0;j<2;j++){
  521. for(var i=0;i<msgList.length;i++){
  522. //先显示未读的 再显示已经读的
  523. var times;
  524. if(msgList[i].unread>0){
  525. times=0;
  526. }
  527. else{
  528. times = 1;
  529. }
  530. if(times==j){
  531. strHtml+="<li>";
  532. var d = new Date()
  533. d.setTime(msgList[i].newTime*1000);
  534. switch(msgList[i].type){
  535. case 1:
  536. var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
  537. var wIndex=getWordIndex(msgList[i].id);
  538. if(wIndex>=0){
  539. var wordSpell = getNodeText(xAllWord[getWordIndex(msgList[i].id)],"real");
  540. }
  541. else{
  542. var wordSpell = "unkow";
  543. }
  544. strHtml+="<span>";
  545. if(msgList[i].unread>0){
  546. strHtml+="<span class='word_msg'>"+msgList[i].unread+"</span>";
  547. }
  548. strHtml+="<a href='#w"+msgList[i].id+"'>[«]</a>";
  549. strHtml+="<a onclick=\"msg_show_msg_content('1','"+msgList[i].id+"')\">"+wordSpell+"</a></span>";
  550. strHtml+="<span>"+d.toLocaleString()+"</span>";
  551. break;
  552. case 2:
  553. strHtml+="<a onclick=\"msg_show_msg_content('2','"+msgList[i].id+"')\">"+msgList[i].id+"</a></span>";
  554. strHtml+="<span>"+d.toLocaleString()+"</span>";
  555. break;
  556. }
  557. strHtml+="</li>";
  558. }
  559. }
  560. }
  561. strHtml+="</ul>";
  562. $("#msg_panal_list").html(strHtml);
  563. }
  564. function _msg_find_id_in_list(arrList,id){
  565. for(var i=0 ; i<arrList.length;i++){
  566. if(arrList[i].id==id){
  567. return(i);
  568. }
  569. }
  570. return(-1);
  571. }
  572. function sortNumber(a, b)
  573. {
  574. return b.newTime-a.newTime;
  575. }