WebSocket.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. MWF.xDesktop = MWF.xDesktop || {};
  2. MWF.xApplication = MWF.xApplication || {};
  3. MWF.require("MWF.xDesktop.Actions.RestActions", null, false);
  4. MWF.xDesktop.WebSocket = new Class({
  5. Implements: [Options, Events],
  6. options: {},
  7. initialize: function(options){
  8. var addressObj = layout.serviceAddressList["x_message_assemble_communicate"];
  9. var uri = new URI(window.location.href);
  10. var scheme = uri.get("scheme");
  11. var wsScheme = (scheme.toString().toLowerCase()==="https") ? "wss" : "ws";
  12. this.ws = wsScheme+"://"+addressObj.host+(addressObj.port==80 ? "" : ":"+addressObj.port)+addressObj.context+"/ws/collaboration";
  13. this.reConnect = true;
  14. this.checking = false;
  15. this.heartTimeout = 60000;
  16. this.checkingTimeout = 4000;
  17. this.heartMsg = "heartbeat";
  18. this.maxErrorCount = 10;
  19. this.errorCount = 0;
  20. // var addressObj = layout.desktop.serviceAddressList["x_collaboration_assemble_websocket"];
  21. // this.ws = "ws://"+addressObj.host+(addressObj.port==80 ? "" : ":"+addressObj.port)+addressObj.context+"/ws/collaboration";
  22. //var ws = "ws://hbxa01.bf.ctc.com/x_collaboration_assemble_websocket/ws/collaboration";
  23. //使用轮询方式处理消息.....
  24. // this.webSocket = {
  25. // "readyState":"1",
  26. // "close": function(){},
  27. // "open": function(){}
  28. // };
  29. // window.setInterval(function(){
  30. // o2.Actions.get("")
  31. // }, 10000);
  32. ///*暂时不启用WebSocket了------------
  33. //this.ws = this.ws+"?x-token="+encodeURIComponent(Cookie.read("x-token"))+"&authorization="+encodeURIComponent(Cookie.read("x-token"));
  34. this.connect();
  35. },
  36. connect: function(){
  37. if (layout.config.webSocketEnable){
  38. var ws = this.ws+"?x-token="+encodeURIComponent(Cookie.read("x-token"));
  39. try{
  40. this.webSocket = new WebSocket(ws);
  41. //this.webSocket = new WebSocket(this.ws);
  42. this.webSocket.onopen = function (e){this.onOpen(e);}.bind(this);
  43. this.webSocket.onclose = function (e){this.onClose(e);}.bind(this);
  44. this.webSocket.onmessage = function (e){this.onMessage(e);}.bind(this);
  45. this.webSocket.onerror = function (e){this.onError(e);}.bind(this);
  46. //---------------------------------*/
  47. }catch(e){
  48. //WebSocket.close();
  49. //this.webSocket = new WebSocket(this.ws);
  50. this.errorCount++;
  51. console.log("Unable to connect to the websocket server, will retry in "+(this.checkingTimeout/1000)+" seconds");
  52. this.checkRetry();
  53. // if (this.webSocket){
  54. // this.close();
  55. // //this.webSocket = new WebSocket(this.ws);
  56. // }
  57. }
  58. }
  59. },
  60. onOpen: function(e){
  61. this.errorCount = 0;
  62. console.log("websocket is open, You can receive system messages");
  63. this.heartbeat();
  64. //MWF.xDesktop.notice("success", {"x": "right", "y": "top"}, "websocket is open ...");
  65. },
  66. onClose: function(e){
  67. console.log("websocket is closed. ");
  68. //if (this.reConnect) this.checkRetry();
  69. //MWF.xDesktop.notice("success", {"x": "right", "y": "top"}, "websocket is closed ...");
  70. },
  71. onMessage: function(e){
  72. if (e.data){
  73. try{
  74. if (e.data===this.heartMsg){
  75. this.heartbeat();
  76. //console.log("get heartbeat...");
  77. return true;
  78. }
  79. var data = JSON.decode(e.data);
  80. switch (data.category){
  81. case "dialog":
  82. switch (data.type){
  83. case "text":
  84. this.receiveChatMessage(data);
  85. break;
  86. default:
  87. }
  88. break;
  89. default:
  90. switch (data.type){
  91. case "task":
  92. case "task_create":
  93. case "task_urge":
  94. case "task_expire":
  95. case "task_press":
  96. this.receiveTaskMessage(data);
  97. break;
  98. case "read":
  99. case "read_create":
  100. this.receiveReadMessage(data);
  101. break;
  102. case "review":
  103. this.receiveReviewMessage(data);
  104. break;
  105. case "fileEditor":
  106. case "attachment_editor":
  107. case "attachment_editorCancel":
  108. case "attachment_editorModify":
  109. this.receiveFileEditorMessage(data);
  110. break;
  111. case "fileShare":
  112. case "attachment_share":
  113. case "attachment_shareCancel":
  114. this.receiveFileShareMessage(data);
  115. break;
  116. case "meetingInvite":
  117. case "meeting_invite":
  118. this.receiveMeetingInviteMessage(data);
  119. break;
  120. case "meetingCancel":
  121. case "meeting_cancel":
  122. this.receiveMeetingCancelMessage(data);
  123. break;
  124. case "meetingAccept":
  125. case "meeting_accept":
  126. this.receiveMeetingAcceptMessage(data);
  127. break;
  128. case "meetingReject":
  129. case "meeting_reject":
  130. this.receiveMeetingRejectMessage(data);
  131. break;
  132. case "attendanceAppealInvite":
  133. this.receiveAttendanceAppealInviteMessage(data);
  134. break;
  135. case "attendanceAppealAccept":
  136. this.receiveAttendanceAppealAcceptMessage(data);
  137. break;
  138. case "attendanceAppealReject":
  139. this.receiveAttendanceAppealRejectMessage(data);
  140. break;
  141. case "calendar_alarm":
  142. this.receiveAttendanceAppealRejectMessage(data);
  143. break;
  144. case "custom_create":
  145. this.receiveCustomMessage(data);
  146. break;
  147. default:
  148. }
  149. }
  150. }catch(e){}
  151. }
  152. },
  153. onError: function(e){
  154. this.errorCount++;
  155. //console.log(e);
  156. console.log("Unable to connect to the websocket server, will retry in "+(this.checkingTimeout/1000)+" seconds.");
  157. this.checkRetry();
  158. //MWF.xDesktop.notice("success", {"x": "right", "y": "top"}, "websocket is error ...");
  159. },
  160. checkRetry: function(){
  161. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  162. if (this.heartbeatCheck) window.clearTimeout(this.heartbeatCheck);
  163. if (this.errorCount < this.maxErrorCount) this.serverCheck = window.setTimeout(function(){
  164. this.retry();
  165. }.bind(this), this.checkingTimeout);
  166. },
  167. retry: function(){
  168. if (this.webSocket){
  169. this.close();
  170. }
  171. console.log("Retry connect to websocket server. ("+this.errorCount+"/"+this.maxErrorCount+")");
  172. this.connect();
  173. },
  174. close: function(){
  175. this.reConnect = false;
  176. if (this.webSocket) this.webSocket.close();
  177. //WebSocket.close();
  178. },
  179. send: function(msg){
  180. if (!this.webSocket || this.webSocket.readyState != 1) {
  181. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  182. this.retry();
  183. }
  184. // try{
  185. this.webSocket.send(JSON.encode(msg));
  186. // }catch(e){
  187. // this.retry();
  188. // this.webSocket.send(JSON.encode(msg));
  189. // }
  190. },
  191. heartbeat: function(){
  192. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  193. if (this.heartbeatCheck) window.clearTimeout(this.heartbeatCheck);
  194. this.heartbeatCheck = window.setTimeout(function(){
  195. this.sendHeartbeat(this.heartMsg);
  196. }.bind(this), this.heartTimeout);
  197. },
  198. sendHeartbeat: function(msg){
  199. if (!this.webSocket || this.webSocket.readyState != 1) {
  200. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  201. this.retry();
  202. }
  203. try{
  204. //console.log("send heartbeat ...");
  205. this.webSocket.send(msg);
  206. this.checkRetry();
  207. }catch(e){
  208. //console.log("send heartbeat error !!!");
  209. if (this.serverCheck) window.clearTimeout(this.serverCheck);
  210. this.retry();
  211. //this.initialize();
  212. }
  213. },
  214. receiveChatMessage: function(data){
  215. if (layout.desktop.widgets["IMIMWidget"]) layout.desktop.widgets["IMIMWidget"].receiveChatMessage(data);
  216. //if (layout.desktop.top.userPanel) layout.desktop.top.userPanel.receiveChatMessage(data);
  217. },
  218. openWork: function(id, e){
  219. o2.Actions.get("x_processplatform_assemble_surface").getWorkInfor(id, function(){
  220. var options = {"workId": id, "appId": "process.Work"+id};
  221. layout.desktop.openApplication(e, "process.Work", options);
  222. }.bind(this), function(){
  223. layout.desktop.openApplication(e, "process.TaskCenter", null, {
  224. "status": {
  225. "navi": "task"
  226. }
  227. });
  228. }.bind(this));
  229. },
  230. receiveTaskMessage: function(data){
  231. debugger;
  232. var task = data.body;
  233. //var content = MWF.LP.desktop.messsage.receiveTask+"《"+task.title+"》, "+MWF.LP.desktop.messsage.activity+": <font style='color: #ea621f'>"+(task.activityName || "")+"</font>";
  234. var content = data.title;
  235. content += "<br/><font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.appliction+": </font><font style='color: #ea621f'>"+task.applicationName+"</font>; "+
  236. "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.process+": </font><font style='color: #ea621f'>"+task.processName+"</font>";
  237. var msg = {
  238. "subject": MWF.LP.desktop.messsage.taskMessage,
  239. "content": content
  240. };
  241. var messageItem = layout.desktop.message.addMessage(msg);
  242. var tooltipItem = layout.desktop.message.addTooltip(msg);
  243. tooltipItem.contentNode.addEvent("click", function(e){
  244. layout.desktop.message.hide();
  245. this.openWork(task.work,e);
  246. }.bind(this));
  247. messageItem.contentNode.addEvent("click", function(e){
  248. layout.desktop.message.addUnread(-1);
  249. layout.desktop.message.hide();
  250. this.openWork(task.work,e);
  251. }.bind(this));
  252. },
  253. receiveReadMessage: function(data){
  254. var read = data.body;
  255. //var content = MWF.LP.desktop.messsage.receiveRead+"《"+read.title+"》. ";
  256. var content = data.title;
  257. content += "<br/><font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.appliction+": </font><font style='color: #ea621f'>"+read.applicationName+"</font>; "+
  258. "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.process+": </font><font style='color: #ea621f'>"+read.processName+"</font>";
  259. var msg = {
  260. "subject": MWF.LP.desktop.messsage.readMessage,
  261. "content": content
  262. };
  263. var messageItem = layout.desktop.message.addMessage(msg);
  264. var tooltipItem = layout.desktop.message.addTooltip(msg);
  265. tooltipItem.contentNode.addEvent("click", function(e){
  266. layout.desktop.message.hide();
  267. this.openWork(read.work,e);
  268. }.bind(this));
  269. messageItem.contentNode.addEvent("click", function(e){
  270. layout.desktop.message.addUnread(-1);
  271. layout.desktop.message.hide();
  272. this.openWork(read.work,e);
  273. }.bind(this));
  274. },
  275. receiveCustomMessage: function(data){
  276. var content = "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.customMessage+"</font>"+data.body;
  277. var msg = {
  278. "subject": MWF.LP.desktop.messsage.customMessageTitle,
  279. "content": content
  280. };
  281. var messageItem = layout.desktop.message.addMessage(msg);
  282. var tooltipItem = layout.desktop.message.addTooltip(msg);
  283. },
  284. receiveReviewMessage: function(data){
  285. var content = MWF.LP.desktop.messsage.receiveReview+"《"+data.title+"》. ";
  286. content += "<br/><font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.appliction+": </font><font style='color: #ea621f'>"+data.applicationName+"</font>; "+
  287. "<font style='color: #333; font-weight: bold'>"+MWF.LP.desktop.messsage.process+": </font><font style='color: #ea621f'>"+data.processName+"</font>";
  288. var msg = {
  289. "subject": MWF.LP.desktop.messsage.reviewMessage,
  290. "content": content
  291. };
  292. var messageItem = layout.desktop.message.addMessage(msg);
  293. var tooltipItem = layout.desktop.message.addTooltip(msg);
  294. tooltipItem.contentNode.addEvent("click", function(e){
  295. layout.desktop.message.hide();
  296. layout.desktop.openApplication(e, "process.TaskCenter", null, {
  297. "status": {
  298. "navi": "review"
  299. }
  300. });
  301. });
  302. messageItem.contentNode.addEvent("click", function(e){
  303. layout.desktop.message.addUnread(-1);
  304. layout.desktop.message.hide();
  305. layout.desktop.openApplication(e, "process.TaskCenter", null, {
  306. "status": {
  307. "navi": "review"
  308. }
  309. });
  310. });
  311. },
  312. receiveFileEditorMessage: function(data){
  313. var content = "<font style='color: #ea621f; font-weight: bold'>"+data.person+"</font> "+MWF.LP.desktop.messsage.receiveFileEditor+"“"+data.name+"”. ";
  314. var msg = {
  315. "subject": MWF.LP.desktop.messsage.fileEditorMessage,
  316. "content": content
  317. };
  318. var messageItem = layout.desktop.message.addMessage(msg);
  319. var tooltipItem = layout.desktop.message.addTooltip(msg);
  320. tooltipItem.contentNode.addEvent("click", function(e){
  321. layout.desktop.message.hide();
  322. layout.desktop.openApplication(e, "File", null, {
  323. "status": {
  324. "tab": "editor",
  325. "node": data.person
  326. }
  327. });
  328. });
  329. messageItem.contentNode.addEvent("click", function(e){
  330. layout.desktop.message.addUnread(-1);
  331. layout.desktop.message.hide();
  332. layout.desktop.openApplication(e, "File", null, {
  333. "status": {
  334. "tab": "editor",
  335. "node": data.person
  336. }
  337. });
  338. });
  339. },
  340. receiveFileShareMessage: function(data){
  341. var content = "<font style='color: #ea621f; font-weight: bold'>"+data.person+"</font> "+MWF.LP.desktop.messsage.receiveFileShare+"“"+data.name+"”. ";
  342. var msg = {
  343. "subject": MWF.LP.desktop.messsage.fileShareMessage,
  344. "content": content
  345. };
  346. var messageItem = layout.desktop.message.addMessage(msg);
  347. var tooltipItem = layout.desktop.message.addTooltip(msg);
  348. tooltipItem.contentNode.addEvent("click", function(e){
  349. layout.desktop.message.hide();
  350. layout.desktop.openApplication(e, "File", null, {
  351. "status": {
  352. "tab": "share",
  353. "node": data.person
  354. }
  355. });
  356. });
  357. messageItem.contentNode.addEvent("click", function(e){
  358. layout.desktop.message.addUnread(-1);
  359. layout.desktop.message.hide();
  360. layout.desktop.openApplication(e, "File", null, {
  361. "status": {
  362. "tab": "share",
  363. "node": data.person
  364. }
  365. });
  366. });
  367. },
  368. getMeeting: function(data, callback){
  369. //this.action = new MWF.xDesktop.Actions.RestActions("/Actions/action.json", "x_meeting_assemble_control", "x_component_Meeting");
  370. //var action = new MWF.xDesktop.Actions.RestActions("/Actions/action.json", "x_meeting_assemble_control", "x_component_Meeting");
  371. if( data.body && typeOf( data.body ) === "object" ){
  372. var data = data.body;
  373. MWF.Actions.get("x_meeting_assemble_control").getRoom(data.room, function(roomJson){
  374. data.roomName = roomJson.data.name;
  375. MWF.Actions.get("x_meeting_assemble_control").getBuilding(roomJson.data.building, function(buildingJson){
  376. data.buildingName = buildingJson.data.name;
  377. if (callback) callback(data);
  378. }.bind(this));
  379. }.bind(this));
  380. }else{
  381. MWF.Actions.get("x_meeting_assemble_control").getMeeting(data.metting, function(json){
  382. var data = json.data;
  383. MWF.Actions.get("x_meeting_assemble_control").getRoom(data.room, function(roomJson){
  384. data.roomName = roomJson.data.name;
  385. MWF.Actions.get("x_meeting_assemble_control").getBuilding(roomJson.data.building, function(buildingJson){
  386. data.buildingName = buildingJson.data.name;
  387. if (callback) callback(data);
  388. }.bind(this));
  389. }.bind(this));
  390. }.bind(this));
  391. }
  392. },
  393. receiveMeetingInviteMessage: function(data){
  394. debugger;
  395. this.getMeeting(data, function(meeting){
  396. var content = MWF.LP.desktop.messsage.meetingInvite;
  397. content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  398. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  399. content = content.replace(/{date}/g, date);
  400. content = content.replace(/{subject}/g, meeting.subject);
  401. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  402. var msg = {
  403. "subject": MWF.LP.desktop.messsage.meetingInviteMessage,
  404. "content": content
  405. };
  406. var messageItem = layout.desktop.message.addMessage(msg);
  407. var tooltipItem = layout.desktop.message.addTooltip(msg);
  408. tooltipItem.contentNode.addEvent("click", function(e){
  409. layout.desktop.message.hide();
  410. layout.desktop.openApplication(e, "Meeting", null);
  411. });
  412. messageItem.contentNode.addEvent("click", function(e){
  413. layout.desktop.message.addUnread(-1);
  414. layout.desktop.message.hide();
  415. layout.desktop.openApplication(e, "Meeting", null);
  416. });
  417. }.bind(this));
  418. },
  419. receiveMeetingCancelMessage: function(data){
  420. debugger;
  421. this.getMeeting(data, function(meeting){
  422. var content = MWF.LP.desktop.messsage.meetingCancel;
  423. content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  424. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  425. content = content.replace(/{date}/g, date);
  426. content = content.replace(/{subject}/g, meeting.subject);
  427. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  428. var msg = {
  429. "subject": MWF.LP.desktop.messsage.meetingCancelMessage,
  430. "content": content
  431. };
  432. var messageItem = layout.desktop.message.addMessage(msg);
  433. var tooltipItem = layout.desktop.message.addTooltip(msg);
  434. tooltipItem.contentNode.addEvent("click", function(e){
  435. layout.desktop.message.hide();
  436. layout.desktop.openApplication(e, "Meeting", null);
  437. });
  438. messageItem.contentNode.addEvent("click", function(e){
  439. layout.desktop.message.addUnread(-1);
  440. layout.desktop.message.hide();
  441. layout.desktop.openApplication(e, "Meeting", null);
  442. });
  443. }.bind(this));
  444. },
  445. receiveMeetingAcceptMessage: function(data){
  446. debugger;
  447. this.getMeeting(data, function(meeting){
  448. var content = MWF.LP.desktop.messsage.meetingAccept;
  449. //content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  450. content = content.replace(/{person}/g, MWF.name.cn(data.person));
  451. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  452. content = content.replace(/{date}/g, date);
  453. content = content.replace(/{subject}/g, meeting.subject);
  454. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  455. var msg = {
  456. "subject": MWF.LP.desktop.messsage.meetingAcceptMessage,
  457. "content": content
  458. };
  459. var messageItem = layout.desktop.message.addMessage(msg);
  460. var tooltipItem = layout.desktop.message.addTooltip(msg);
  461. tooltipItem.contentNode.addEvent("click", function(e){
  462. layout.desktop.message.hide();
  463. layout.desktop.openApplication(e, "Meeting", null);
  464. });
  465. messageItem.contentNode.addEvent("click", function(e){
  466. layout.desktop.message.addUnread(-1);
  467. layout.desktop.message.hide();
  468. layout.desktop.openApplication(e, "Meeting", null);
  469. });
  470. }.bind(this));
  471. },
  472. receiveMeetingRejectMessage: function(data){
  473. debugger;
  474. this.getMeeting(data, function(meeting){
  475. var content = MWF.LP.desktop.messsage.meetingReject;
  476. //content = content.replace(/{person}/g, MWF.name.cn(meeting.applicant));
  477. content = content.replace(/{person}/g, MWF.name.cn(data.person));
  478. var date = Date.parse(meeting.startTime).format("%Y-%m-%d- %H:%M");
  479. content = content.replace(/{date}/g, date);
  480. content = content.replace(/{subject}/g, meeting.subject);
  481. content = content.replace(/{addr}/g, meeting.roomName+"("+meeting.buildingName+")");
  482. var msg = {
  483. "subject": MWF.LP.desktop.messsage.meetingRejectMessage,
  484. "content": content
  485. };
  486. var messageItem = layout.desktop.message.addMessage(msg);
  487. var tooltipItem = layout.desktop.message.addTooltip(msg);
  488. tooltipItem.contentNode.addEvent("click", function(e){
  489. layout.desktop.message.hide();
  490. layout.desktop.openApplication(e, "Meeting", null);
  491. });
  492. messageItem.contentNode.addEvent("click", function(e){
  493. layout.desktop.message.addUnread(-1);
  494. layout.desktop.message.hide();
  495. layout.desktop.openApplication(e, "Meeting", null);
  496. });
  497. }.bind(this));
  498. },
  499. receiveAttendanceAppealInviteMessage : function(data){
  500. var content = MWF.LP.desktop.messsage.attendanceAppealInvite;
  501. content = content.replace(/{subject}/g, data.subject);
  502. var msg = {
  503. "subject": MWF.LP.desktop.messsage.attendanceAppealInviteMessage,
  504. "content": content
  505. };
  506. var messageItem = layout.desktop.message.addMessage(msg);
  507. var tooltipItem = layout.desktop.message.addTooltip(msg);
  508. tooltipItem.contentNode.addEvent("click", function(e){
  509. layout.desktop.message.hide();
  510. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"13"});
  511. });
  512. messageItem.contentNode.addEvent("click", function(e){
  513. layout.desktop.message.addUnread(-1);
  514. layout.desktop.message.hide();
  515. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"13"});
  516. });
  517. },
  518. receiveAttendanceAppealAcceptMessage : function(data){
  519. var content = MWF.LP.desktop.messsage.attendanceAppealAccept;
  520. content = content.replace(/{subject}/g, data.subject);
  521. var msg = {
  522. "subject": MWF.LP.desktop.messsage.attendanceAppealAcceptMessage,
  523. "content": content
  524. };
  525. var messageItem = layout.desktop.message.addMessage(msg);
  526. var tooltipItem = layout.desktop.message.addTooltip(msg);
  527. tooltipItem.contentNode.addEvent("click", function(e){
  528. layout.desktop.message.hide();
  529. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  530. });
  531. messageItem.contentNode.addEvent("click", function(e){
  532. layout.desktop.message.addUnread(-1);
  533. layout.desktop.message.hide();
  534. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  535. });
  536. },
  537. receiveAttendanceAppealRejectMessage : function(data){
  538. var content = MWF.LP.desktop.messsage.attendanceAppealReject;
  539. content = content.replace(/{subject}/g, data.subject);
  540. var msg = {
  541. "subject": MWF.LP.desktop.messsage.attendanceAppealRejectMessage,
  542. "content": content
  543. };
  544. var messageItem = layout.desktop.message.addMessage(msg);
  545. var tooltipItem = layout.desktop.message.addTooltip(msg);
  546. tooltipItem.contentNode.addEvent("click", function(e){
  547. layout.desktop.message.hide();
  548. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  549. });
  550. messageItem.contentNode.addEvent("click", function(e){
  551. layout.desktop.message.addUnread(-1);
  552. layout.desktop.message.hide();
  553. layout.desktop.openApplication(e, "Attendance", {"curNaviId":"12"});
  554. });
  555. }
  556. });