client.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089
  1. window.debug = true;
  2. // 记录聊天双方信息
  3. var dataInfo = {};
  4. // 存储应用数据
  5. var app = {};
  6. app.gid = undefined;
  7. // 储存聊天的会话记录信息
  8. app.sessions = {};
  9. // 聊天记录是否已经展开
  10. app.isShowRecord = false;
  11. $(document).ready(ready);
  12. function connectServer() {
  13. // 连接XMPP服务器
  14. Client.connect(app.userInfo.userId, app.userInfo.certification);
  15. }
  16. // 接收到<message>
  17. /**
  18. * 处理接收到Message
  19. *
  20. * @param message 用户接收到的消息
  21. */
  22. function onMessage(message) {
  23. console.log('subscribe received message', message);
  24. // 如果是当前会话,则直接显示消息
  25. if (app.currentSession && message.senderInfo === app.currentSession.linkman) {
  26. // 显示消息
  27. drawMessage(message, false);
  28. }
  29. // 缓存消息
  30. console.log(message);
  31. if (message.senderInfo && message.receiverInfo) {
  32. saveMessageToLocal(message, false);
  33. }
  34. return true;
  35. }
  36. /**
  37. * 用户发送消息
  38. *
  39. * @param message 已填充的消息
  40. */
  41. function sendMessage(message) {
  42. if (!message) {
  43. return ;
  44. }
  45. if (Client.isConnected()) {
  46. if (!message.receiver || message.receiver == '') {
  47. alert("请输入联系人!");
  48. return;
  49. }
  50. message = Client.sendMessage(message);
  51. // 显示消息
  52. drawMessage(message || {}, true);
  53. saveMessageToLocal(message, true);
  54. $("#input-msg").empty();
  55. } else {
  56. alert("请先登录!");
  57. }
  58. }
  59. function activate() {
  60. app = httpUtils.queryParams() || {};
  61. if (window.debug) {
  62. console.log('[DEBUG]App Info', app);
  63. }
  64. onfire.on('chat.message', onMessage);
  65. ChatService.queryChatInfoWhenUserVisitWebSite(app.gid, function (data) {
  66. if (!data.success) {
  67. console.log('Message', data.message);
  68. return ;
  69. }
  70. app.userInfo = data.chatInfo.userInfo;
  71. app.enterprise = data.chatInfo.enterprise;
  72. app.groups = data.groups || [];
  73. // 绘制用户信息
  74. drawUserInfo();
  75. // 绘制会话列表
  76. app.sessions = handlerSessionData(data.sessions || []);
  77. drawSessionList(app.sessions);
  78. // 绘制会话区域
  79. if (app.currentSession) {
  80. drawTitle();
  81. showChatArea();
  82. handlerUnReadMessage();
  83. }
  84. connectServer();
  85. }, function (error) {
  86. console.log(error);
  87. window.location.href = '/';
  88. });
  89. }
  90. function handlerUnReadMessage() {
  91. // 获取未读消息缓存
  92. messageService.loadReadableMessageWhenUserRead(app.currentSession.owner, app.currentSession.linkman, function (messages) {
  93. if (window.debug) {
  94. console.log('message.unread', messages);
  95. }
  96. // 显示消息
  97. messages.forEach(function (message) {
  98. drawMessage(message, message.style == 'SEND');
  99. });
  100. }, function (error) {
  101. console.log(error);
  102. });
  103. }
  104. function handlerSessionData(data) {
  105. var sessions = {};
  106. if (data && data.length > 0) {
  107. for (var i = 0; i < data.length; i++) {
  108. if (!data[i].linkman || data[i].linkman === '') {
  109. continue;
  110. }
  111. if (!sessions[data[i].linkman]) {
  112. sessions[data[i].linkman] = data[i];
  113. sessions[data[i].linkman].userInfo = sessions[data[i].linkman].linkmanInfo.userInfo;
  114. sessions[data[i].linkman].enterprise = sessions[data[i].linkman].linkmanInfo.enterprise;
  115. } else {
  116. if (sessions[data[i].linkman].timeSend < data[i].timeSend) {
  117. sessions[data[i].linkman] = data[i];
  118. }
  119. }
  120. }
  121. }
  122. // 获取当前会话
  123. var current = false;
  124. for (var property in sessions) {
  125. if (sessions.hasOwnProperty(property) && sessions[property] && sessions[property].current) {
  126. current = true;
  127. app.currentSession = sessions[property] || {};
  128. break ;
  129. }
  130. }
  131. if (!current) {
  132. delete app.currentSession;
  133. }
  134. return sessions;
  135. }
  136. function formatTime(timestamp) {
  137. if (timestamp == null) return '';
  138. var date = new Date(timestamp * 1000),
  139. year = date.getFullYear(),
  140. month = '' + (date.getMonth() + 1),
  141. day = '' + date.getDate();
  142. if (month.length < 2) month = '0' + month;
  143. if (day.length < 2) day = '0' + day;
  144. return [year, month, day].join('-');
  145. }
  146. function formatHourTime(timestamp) {
  147. if (timestamp == null) return '';
  148. var date = new Date(timestamp * 1000),
  149. hour = '' + date.getHours(),
  150. minute = '' + date.getMinutes();
  151. if (hour.length < 2) hour = '0' + hour;
  152. if (minute.length < 2) minute = '0' + minute;
  153. return [hour, minute].join(':');
  154. }
  155. function formatFullTime(timestamp) {
  156. if (timestamp == null) return '';
  157. var date = new Date(timestamp * 1000),
  158. year = date.getFullYear(),
  159. month = '' + (date.getMonth() + 1),
  160. day = '' + date.getDate(),
  161. hour = '' + date.getHours(),
  162. minute = '' + date.getMinutes(),
  163. second = '' + date.getSeconds();
  164. if (month.length < 2) month = '0' + month;
  165. if (day.length < 2) day = '0' + day;
  166. if (hour.length < 2) hour = '0' + hour;
  167. if (minute.length < 2) minute = '0' + minute;
  168. if (second.length < 2) second = '0' + second;
  169. return [year, month, day].join('-') + ' ' + [hour, minute, second].join(':');
  170. }
  171. function showChatArea() {
  172. $('#chat-area').show();
  173. }
  174. function hideChatArea() {
  175. $('#chat-area').hide();
  176. }
  177. function drawUserInfo() {
  178. console.log('APP', app);
  179. var str = '<div class="img"><img src="/style/img/photo01.png" /></div>' +
  180. '<div class="content">' +
  181. '<span><span>' + app.userInfo.name + '</span><div class="star-img-group"><img src="/style/img/star.png"><img src="/style/img/star.png"><img src="/style/img/star.png"></div></span>' +
  182. '<p>';
  183. if (app.enterprise){
  184. str +=(app.enterprise.name);
  185. }else {str +=('个人账户');}
  186. str +=('</p></div>');
  187. $('#member-title').html(str);
  188. /*<div class="title-icon"><img src="/style/img/zoomIn.png" alt=""> <img src="/style/img/close.png" alt=""> </div>*/
  189. }
  190. function drawTitle() {
  191. var name = '';
  192. if (app.currentSession) {
  193. if (app.currentSession.linkmanInfo.enterprise != null){
  194. // if ('ENTERPRISE' === app.currentSession.communicatorType) {
  195. // name = app.currentSession.linkmanInfo.userInfo.name + '-' + app.currentSession.linkmanInfo.enterprise.name;
  196. // } else {
  197. name = app.currentSession.linkmanInfo.enterprise.name;
  198. // }
  199. }else{
  200. name = '个人账户';
  201. }
  202. }
  203. $('#chat-title').html('<h3 title="'+name +'(' +app.currentSession.linkmanInfo.userInfo.name.substring(0,1)+ '**)' +'">' + name + '(' + app.currentSession.linkmanInfo.userInfo.name.substring(0,1) + '**)</h3>');
  204. /*<div class="title-icon"><img src="/style/img/zoomIn.png" alt=""> <img src="/style/img/close.png" alt=""> </div>*/
  205. }
  206. /**
  207. * 清空聊天记录
  208. */
  209. function clearMessage() {
  210. $("#chat-receiver-log ul").empty();
  211. }
  212. /**
  213. * 展示消息内容
  214. *
  215. * @param message 消息内容
  216. * @param isSend 是否为发送消息
  217. */
  218. function drawMessage(message, isSend) {
  219. var userName = '';
  220. /*if (!isSend) {
  221. if (message.senderType === 'STORE') {
  222. userName = app.currentSession.enterprise.name;
  223. }
  224. if (message.senderType === 'ENTERPRISE') {
  225. userName = app.currentSession.userInfo.name + '-' + app.currentSession.enterprise.name;
  226. }
  227. } else {
  228. userName = app.userInfo.name;
  229. }*/ //暂时没用到这个userName
  230. console.log(message.content)
  231. $('#chat-receiver-log ul').append('<li class="chat-log ' + (isSend ? 'chat-log-send' : 'chat-log-receive') + '">' +
  232. '<div class="chat-log-avatar">' +
  233. '<img src="/style/img/photo01.png" alt="头像"></img>' +
  234. '</div>' +
  235. '<div class="chat-log-text">' +
  236. message.content +
  237. '</div>' +
  238. '<div class="clearfix"></div>' +
  239. '</li>');
  240. var height = $('#chat-receiver-log')[0].scrollHeight;
  241. $("#chat-receiver-log").animate({
  242. scrollTop : height
  243. }, 300);
  244. }
  245. function drawSessionList(sessions) {
  246. $('#session-list .list-group').text('');
  247. // $('#session-list .list-group2').text('');
  248. for (var property in sessions) {
  249. if (sessions[property].isBlack){
  250. continue;
  251. }
  252. if (sessions.hasOwnProperty(property) && sessions[property]) {
  253. var sessionStyle = '', record = '';
  254. if (!sessions[property].read) {
  255. //sessionStyle = 'bg-warning';
  256. }
  257. if (app.currentSession && app.currentSession.linkman && app.currentSession.linkman !== '') {
  258. if (sessions[property].id === app.currentSession.id) {
  259. sessionStyle = 'active';
  260. }
  261. }
  262. if (sessions[property].type == 1) {
  263. record = sessions[property].content.replace(/<img class="emoji_icon".*?>/, '[表情]');
  264. } else if (sessions[property].type == 2) {
  265. record = '[图片]';
  266. } else if (sessions[property].type == 3) {
  267. record = '[文件]';
  268. }
  269. var flag = "'" + sessions[property].linkman + "'";
  270. var enStr;
  271. if(sessions[property].enterprise == null){
  272. enStr = '个人账户'+'('+sessions[property].userInfo.name.substring(0,1)+"**)";
  273. }else{
  274. enStr = sessions[property].enterprise.name+'('+sessions[property].userInfo.name.substring(0,1)+"**)";
  275. }
  276. var listStr = '<dl class="' + sessionStyle + '">' +
  277. '<a href="javascript:void(0);" onclick="switchNewSession(' + flag + ')">' +
  278. // '<dt><em>寄售</em><img src="/style/img/photo01.png"/></dt>' +
  279. '<dt><img src="/style/img/photo01.png"/></dt>' +
  280. '<dd>' +
  281. '<span class="name" title="'+enStr+'">' + enStr + '</span>' +
  282. '<span class="time">' + formatHourTime(sessions[property].timeSend) + '</span>' +
  283. '</dd>' +
  284. '<dd class="record">' + (sessions[property].content.substring(0, 4) == '<img' ? '[图片]' : sessions[property].content);
  285. console.log(sessions[property].read);
  286. listStr += '</dd>';
  287. if (!sessions[property].read) { //未读信息加上标志
  288. listStr += '<i></i>';
  289. }
  290. listStr += '</a></dl>';
  291. $('#session-list .list-group').append(listStr);
  292. }
  293. }
  294. }
  295. /**
  296. * 缓存消息到服务器
  297. *
  298. * @param stanza 消息内容
  299. * @param isMySend 是否为自己发送
  300. */
  301. function saveMessageToLocal(stanza, isMySend) {
  302. console.log('message.body', stanza);
  303. if (isMySend === null || isMySend === undefined) {
  304. isMySend = stanza.senderInfo === app.currentSession.owner;
  305. }
  306. stanza.own = app.gid;
  307. stanza.mySend = isMySend;
  308. stanza.style = isMySend ? 'SEND' : 'RECEIVE';
  309. if (isMySend || (!isMySend && app.currentSession && stanza.senderInfo === app.currentSession.linkman)) {
  310. stanza.read = true;
  311. } else {
  312. stanza.read = false;
  313. }
  314. if (stanza.style === 'RECEIVE'){
  315. stanza.id = stanza.uuid;
  316. }
  317. // 缓存消息
  318. messageService.cacheMessageWhenClientReceive(stanza, function (sessions) {
  319. if (window.debug) {
  320. console.log('[DEBUG]Update Sessions:', sessions);
  321. }
  322. // 绘制会话列表
  323. app.sessions = handlerSessionData(sessions);
  324. drawSessionList(app.sessions);
  325. }, function (error) {
  326. console.log('Cache Fail', error);
  327. });
  328. }
  329. function ready() {
  330. activate();
  331. // // 添加Emoji
  332. // $('#input-msg').emoji({
  333. // button: "#show-emoji",
  334. // showTab: false,
  335. // animation: 'slide',
  336. // icons: [{
  337. // name: "QQ表情",
  338. // path: "/style/img/qq/",
  339. // maxNum: 91,
  340. // excludeNums: [41, 45, 54],
  341. // file: ".gif"
  342. // }]
  343. // });
  344. // 点击回车发送消息
  345. $('#input-msg').keydown(function (event) {
  346. if (event.keyCode == 13) {
  347. clickSendMessage();
  348. }
  349. });
  350. // 点击回车发送消息后,清除换行字符
  351. $('#input-msg').keyup(function (event) {
  352. console.log(event.keyCode);
  353. if (event.keyCode == 13) {
  354. $("#input-msg").empty();
  355. }
  356. });
  357. // 处理复制内容转化成文本内容
  358. $('[contenteditable]').each(function() {
  359. // 干掉IE http之类地址自动加链接
  360. try {
  361. document.execCommand("AutoUrlDetect", false, false);
  362. } catch (e) {}
  363. $(this).on('paste', function(e) {
  364. var text = null;
  365. if(window.clipboardData && clipboardData.setData) {
  366. // IE
  367. text = window.clipboardData.getData('text');
  368. } else {
  369. text = (e.originalEvent || e).clipboardData.getData('text/plain') ||
  370. (e.originalEvent || e).clipboardData.getData('image');
  371. }
  372. // 如果获取不到文本内容,可能是图片等,直接返回
  373. if (!text) return;
  374. // 获取到文本内容,将文本内容添加进入输入框
  375. e.preventDefault();
  376. if (document.body.createTextRange) {
  377. if (document.selection) {
  378. textRange = document.selection.createRange();
  379. } else if (window.getSelection) {
  380. sel = window.getSelection();
  381. var range = sel.getRangeAt(0);
  382. // 创建临时元素,使得TextRange可以移动到正确的位置
  383. var tempEl = document.createElement("span");
  384. tempEl.innerHTML = "&#FEFF;";
  385. range.deleteContents();
  386. range.insertNode(tempEl);
  387. textRange = document.body.createTextRange();
  388. textRange.moveToElementText(tempEl);
  389. tempEl.parentNode.removeChild(tempEl);
  390. }
  391. textRange.text = text;
  392. textRange.collapse(false);
  393. textRange.select();
  394. } else {
  395. // Chrome之类浏览器
  396. document.execCommand("insertText", false, text);
  397. }
  398. });
  399. // 去除Crtl+b/Ctrl+i/Ctrl+u等快捷键
  400. $(this).on('keydown', function(e) {
  401. // e.metaKey for mac
  402. if (e.ctrlKey || e.metaKey) {
  403. switch(e.keyCode){
  404. case 66: //ctrl+B or ctrl+b
  405. case 98:
  406. case 73: //ctrl+I or ctrl+i
  407. case 105:
  408. case 85: //ctrl+U or ctrl+u
  409. case 117: {
  410. e.preventDefault();
  411. break;
  412. }
  413. }
  414. }
  415. });
  416. });
  417. // 发送消息
  418. $("#btn-send").click(clickSendMessage);
  419. // 关闭聊天窗口
  420. $("#btn-close").click(closeChatArea);
  421. // 上传图片
  422. $('#upload-image-btn').click(function () {
  423. // 触发文件上传的点击
  424. $('#upload-image').click();
  425. });
  426. // 上传图片获取图片信息
  427. $('#upload-image').change(uploadImage);
  428. // 显示聊天历史
  429. $('#show-chat-record').click(showChatRecord);
  430. $('#close-chat-record').click(showChatRecord);
  431. }
  432. /**
  433. * 点击发送按钮,发送消息
  434. */
  435. function clickSendMessage() {
  436. console.log(1);
  437. var message = new Message();
  438. message.type = 1;
  439. message.senderInfo = app.currentSession.owner;
  440. message.receiverInfo = app.currentSession.linkman;
  441. message.senderType = app.currentSession.communicatorType;
  442. message.sender = app.userInfo.userId;
  443. message.receiver = app.currentSession.userInfo.userId;
  444. message.content = $("#input-msg").html();
  445. message.uuid = guid();
  446. if (!message.content || message.content === '') {
  447. $("#input-msg").empty();
  448. return ;
  449. }
  450. if (window.debug) {
  451. console.log('[DEBUG]Send Message', message);
  452. }
  453. sendMessage(message);
  454. }
  455. //用于生成uuid
  456. function S4() {
  457. return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
  458. }
  459. function guid() {
  460. return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
  461. }
  462. /**
  463. * 发送图片
  464. *
  465. * @param url 图片URL
  466. */
  467. function sendImage(url) {
  468. var message = new Message();
  469. message.type = 2;
  470. message.senderInfo = app.currentSession.owner;
  471. message.receiverInfo = app.currentSession.linkman;
  472. message.senderType = app.currentSession.communicatorType;
  473. message.sender = app.userInfo.userId;
  474. message.receiver = app.currentSession.userInfo.userId;
  475. message.content = '<img ondblclick="previewImg(&apos;'+ url + '&apos;)" class="content-image" src="' + (url || '') + '"/>';
  476. message.uuid = guid();
  477. if (window.debug) {
  478. console.log('[DEBUG]Send Message', message.content);
  479. }
  480. sendMessage(message);
  481. }
  482. function previewImg(url) {
  483. $('#preview-img img').attr('src', url);
  484. $('#preview-img').show();
  485. }
  486. function closePreview() {
  487. $('#preview-img').hide();
  488. }
  489. /**
  490. * 点击图片按钮发送图片
  491. */
  492. function uploadImage() {
  493. var file = $('#upload-image')[0].files[0];
  494. if (file) {
  495. var fileSize = 0;
  496. if (file.size > 1024 * 1024) {
  497. fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
  498. } else {
  499. fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
  500. }
  501. // console.log('File Information', fileSize);
  502. var formData = new FormData();
  503. formData.append('file', file);
  504. var fileObj = $("#upload-image")
  505. $('#loading').show();
  506. FileService.uploadImage(formData, function (data) {
  507. sendImage(data);
  508. $('#loading').hide();
  509. fileObj.val("")
  510. }, function (error) {
  511. $('#loading').hide();
  512. console.log(error);
  513. fileObj.val("");
  514. })
  515. }
  516. }
  517. function drawHistoryMessage(message, isSend) {
  518. var name = '', enterpriseName = '', classStyle = '';
  519. if (!isSend) {
  520. name = app.currentSession.userInfo.name;
  521. enterpriseName = app.currentSession.enterprise?app.currentSession.enterprise.name:'个人帐号';
  522. } else {
  523. name = app.userInfo.name;
  524. enterpriseName = app.enterprise?app.enterprise.name:'个人帐号';
  525. classStyle = 'customer';
  526. }
  527. $('#chat-record>ul').prepend('<li class="' + classStyle + '">' +
  528. '<p>' + name.substring(0,1)+'**' + ' ( ' + enterpriseName + ' ) ' + '<time>' + formatFullTime(message.timeSend) + '</time></p>' +
  529. '<p class="content">' + message.content + '</p>' +
  530. '</li>');
  531. }
  532. function loadHistoryMessage(max, min) {
  533. messageService.loadHistoryMessage(app.gid, app.currentSession.linkman, max, min, function (messages) {
  534. app.history = messages;
  535. if (messages && messages.length > 0) {
  536. messages.forEach(function (message) {
  537. drawHistoryMessage(message, message.style === 'SEND');
  538. });
  539. }
  540. var record = $('#chat-record ul')[0];
  541. var lastRecord = $('#chat-record ul li:last-child').height();
  542. var height = record.scrollHeight + lastRecord;
  543. console.log(height);
  544. $("#chat-record ul").animate({
  545. scrollTop : height
  546. }, 0);
  547. // 绘制聊天历史记录
  548. }, function (error) {
  549. console.log(error);
  550. })
  551. }
  552. /**
  553. * 显示聊天历史信息
  554. */
  555. function showChatRecord() {
  556. if (!app.isShowRecord) {
  557. app.isShowRecord = true;
  558. $('.col-md-8 >.row').css('right','232px');
  559. $('#chat-send-area').css('right','217px');
  560. $('#chat-record').show();
  561. $('#chat-area').css({'width':'391px'});
  562. $('#show-chat-record').html('<img src="/style/img/icon04.png"/>&nbsp;关闭聊天记录');
  563. $('#show-chat-record').css('color', 'red');
  564. $('#chat-record>ul').html('');
  565. var max = Math.round(new Date().getTime() / 1000) - (60 * 60 * 24);
  566. loadHistoryMessage(max, null);
  567. } else {
  568. app.isShowRecord = false;
  569. $('.col-md-8 >.row').css('right','15px');
  570. $('#chat-send-area').css('right','0');
  571. $('#chat-record').hide();
  572. $('#chat-area').css({'width':'609px'});
  573. $('#show-chat-record').html('<img src="/style/img/icon04.png"/>&nbsp;聊天记录');
  574. $('#show-chat-record').css('color', '#337ab7');
  575. }
  576. }
  577. /**
  578. * 开启新的会话
  579. */
  580. function switchNewSession(communicator) {
  581. // console.log(communicator);
  582. if (!communicator || communicator === '') return ;
  583. var session = app.sessions[communicator];
  584. sessionService.updateSessionStateWhenUserSwitchNewSession(session.id, function (sessions) {
  585. // 绘制会话列表
  586. app.sessions = handlerSessionData(sessions || []);
  587. drawSessionList(app.sessions);
  588. // 绘制会话区域
  589. if (app.currentSession) {
  590. drawTitle();
  591. showChatArea();
  592. clearMessage();
  593. handlerUnReadMessage();
  594. }
  595. }, function (error) {
  596. console.log(error);
  597. });
  598. }
  599. function closeChatArea() {
  600. delete app.currentSession;
  601. hideChatArea();
  602. drawSessionList(app.sessions);
  603. }
  604. /**
  605. * 加载分组数据
  606. * */
  607. function reloadData(flag) {
  608. ChatService.queryChatInfoWhenUserVisitWebSite(app.gid, function (data) {
  609. if (!data.success) {
  610. console.log('Message', data.message);
  611. return;
  612. }
  613. app.userInfo = data.chatInfo.userInfo;
  614. app.enterprise = data.chatInfo.enterprise;
  615. app.groups = data.groups || [];
  616. app.sessions = handlerSessionData(data.sessions || []);
  617. // drawSessionList(app.sessions);
  618. if (flag) {
  619. toSingleList();
  620. } else {
  621. toDoubleList();
  622. }
  623. });
  624. }
  625. /**
  626. * 分组列表展示
  627. * */
  628. function drawSessionGroup() {
  629. // $('#session-list .list-group').text('');
  630. $('#session-list .list-group2').text('');
  631. var tempStr = '<ul class="group-list">';
  632. app.groups.forEach(function (item, index) {
  633. if (item.chatSessionList == null){
  634. tempStr += '<li><div onmousedown="onGroupMenu(event,' + index + ')" onclick="showDetailList(' + index +')"><img src="/style/img/arrow-right.png" alt=""/><span>'
  635. + item.groupName + ' (0)</span></div></li>';
  636. }else {
  637. tempStr += '<li><div onmousedown="onGroupMenu(event,' + index + ')" onclick="showDetailList(' + index +')"><img src="/style/img/arrow-right.png" alt=""/><span>'
  638. + item.groupName + ' ('+item.chatSessionList.length +')</span></div></li>';
  639. }
  640. });
  641. $('#session-list .list-group2').append(tempStr);
  642. }
  643. /**
  644. * 分组详细列表
  645. * */
  646. function showDetailList(index) {
  647. var temp_index = parseInt(index) + 1;
  648. var tempEl = $('#session-list .list-group2 .group-list >li:nth-child(' + temp_index + ')');
  649. if (tempEl.find('ul').length == 0) {
  650. var tempStr = '<ul class="group-item-list">';
  651. if (app.groups[index].chatSessionList) {
  652. app.groups[index].chatSessionList.forEach(function (item, item_index) {
  653. var id = "'" + item.linkman + "'";
  654. if (item.linkmanInfo.enterprise && item.linkmanInfo.enterprise!=null){
  655. tempStr += '<li onmousedown="onLinkmanMenu(event,'+index+','+item_index+')" onclick="switchNewSession(' +id + ')"><span title="'+item.linkmanInfo.enterprise.name +'('+item.linkmanInfo.userInfo.name.substring(0,1)+'**)">' + item.linkmanInfo.enterprise.name +'('+item.linkmanInfo.userInfo.name.substring(0,1)+'**)</span></li>';
  656. }else{
  657. tempStr += '<li onmousedown="onLinkmanMenu(event,'+index+','+item_index+')" onclick="switchNewSession(' +id + ')"><span title="个人账户('+item.linkmanInfo.userInfo.name.substring(0,1)+'**)">个人账户('+item.linkmanInfo.userInfo.name.substring(0,1)+'**)</span></li>';
  658. }
  659. });
  660. tempStr += '</ul>';
  661. tempEl.append(tempStr);
  662. }
  663. } else {
  664. tempEl.find('ul').remove()
  665. }
  666. }
  667. /**
  668. * 转换显示列表为最近联系人
  669. * */
  670. function toSingleList() {
  671. drawSessionList(app.sessions);
  672. $('#session-list .list-group').show();
  673. $('#session-list .list-group2').hide();
  674. }
  675. /**
  676. * 转换显示列表为分组
  677. * */
  678. function toDoubleList() {
  679. drawSessionGroup();
  680. $('#session-list .list-group').hide();
  681. $('#session-list .list-group2').show();
  682. }
  683. /**
  684. * 转换显示列表
  685. * */
  686. function changeSelectList(type, e) {
  687. var flag = type == 'single' ? true : false;
  688. var left = $(e.target).parent()[0].firstElementChild;
  689. var right = $(e.target).parent()[0].lastElementChild;
  690. left.setAttribute('class', flag ? 'single active' : 'single');
  691. left.firstElementChild.setAttribute('src', flag ? '/style/img/single-active.png' : '/style/img/single.png');
  692. right.setAttribute('class', !flag ? 'double active' : 'double');
  693. right.firstElementChild.setAttribute('src', !flag ? '/style/img/double-active.png' : '/style/img/double.png');
  694. reloadData(flag);
  695. }
  696. /**
  697. * 右键分组菜单
  698. * */
  699. function onGroupMenu(event, index) {
  700. hideGroupListMenu();
  701. $('.linkman-menu').hide();
  702. if (event.button == 2) {
  703. document.oncontextmenu = function () {
  704. return false;
  705. }
  706. var groupName = app.groups[index].groupName;
  707. var x = event.pageX;
  708. var y = event.pageY;
  709. $('.group-menu').attr('style', 'top: ' + y + 'px; left: ' + x + 'px;');
  710. $('.group-menu li').attr('name', index);
  711. if ('我的好友' == groupName){
  712. $('.group-menu .delete-group').hide();
  713. }else {
  714. $('.group-menu .delete-group').show();
  715. }
  716. $('.group-menu').show();
  717. $(document).click(function () {
  718. $('.group-menu').hide();
  719. })
  720. }
  721. }
  722. /**
  723. * 右键联系人操作菜单
  724. * */
  725. function onLinkmanMenu(event, index, item_index) {
  726. hideGroupMenu();
  727. if (event.button == 2) {
  728. document.oncontextmenu = function () {
  729. return false;
  730. }
  731. var x = event.pageX;
  732. var y = event.pageY;
  733. var deleteObj = $('.linkman-menu >li:nth-child(2)');
  734. var toBlackObj = $('.linkman-menu >li:nth-child(3)');
  735. $('.linkman-menu').attr('style', 'top: ' + y + 'px; left: ' + x + 'px;');
  736. var groupName = app.groups[index].groupName;
  737. if ('我的好友' == groupName){
  738. $('.linkman-menu .delete-linkman').hide();
  739. }else {
  740. $('.linkman-menu .delete-linkman').show();
  741. }
  742. $('.linkman-menu').show();
  743. $('.linkman-menu >li:first-child').attr('onmouseenter','showGroupList(event,' + index +',' + item_index + ')');
  744. deleteObj.attr('onclick', 'selectLinkmanMenuItem(event, "2",' + index + ',' + item_index +')');
  745. deleteObj.attr('onmouseenter', 'hideGroupListMenu()');
  746. toBlackObj.attr('onclick', 'selectLinkmanMenuItem(event, "3",' + index + ',' + item_index +')');
  747. toBlackObj.attr('onmouseenter', 'hideGroupListMenu()');
  748. $(document).click(function () {
  749. $('.linkman-menu').hide();
  750. $('.group-list-menu').hide();
  751. })
  752. }
  753. }
  754. /**
  755. * 分组列表菜单展示
  756. * */
  757. function showGroupList(event, index, item_index) {
  758. var obj = $('.group-list-menu');
  759. obj.text('');
  760. var str = '';
  761. var type = 1;
  762. if (app.groups) {
  763. app.groups.forEach(function (item) {
  764. str += '<li onclick="selectLinkmanMenuItem(event,'+ type + ',' + index + ','+item_index+')">' + item.groupName + '</li>'
  765. })
  766. }
  767. var x = $(event.target).parent().css('left');
  768. var y = $(event.target).parent().css('top');
  769. obj.append(str);
  770. obj.css({'top': y, 'left': parseInt(x.substring(0, x.length-2)) + 145 + 'px'});
  771. obj.show();
  772. }
  773. /**
  774. * 分组菜单选择
  775. * */
  776. function selectGroupMenuItem(e, type) {
  777. var ownid = app.gid;
  778. var index = $(e.target).attr('name');
  779. var groupName = app.groups[index].groupName;
  780. if (type == 'add') {
  781. var str = '<li><div><img src="/style/img/arrow-right.png" alt=""><input type="text" onkeyup="onAddGroup(event)" onblur="onAddGroup(event)" placeholder="请输入分组名称" /></div></li>'
  782. $('#session-list .list-group2 .group-list').append(str);
  783. $('#session-list .list-group2 .group-list >li:last-child >div > input').focus();
  784. } else if (type == 'rename') {
  785. var list_index = parseInt(index) +1;
  786. var tempEl = '#session-list .list-group2 .group-list >li:nth-child(' + list_index + ')';
  787. var str = '<input type="text" onkeyup="onRenameGroup(event,' + index +')" onblur="onRenameGroup(event,' + index +')" placeholder="' + groupName + '" />'
  788. $(tempEl + '>div >span').hide();
  789. $(tempEl + '>div').append(str);
  790. $(tempEl + '>div >input').focus();
  791. } else if (type === 'remove') {
  792. if (app.groups[index].groupName === '我的好友') {
  793. return;
  794. }
  795. $('.remind-box').text('');
  796. var str = '<div class="box-header"><img onclick="hideRemindBox()" src="/style/img/remind-box-del.png" alt="" /></div>';
  797. str += '<div class="box-title"><span>!</span><span>是否要删除该分组?</span><div>选定的分组将会被删除,组内联系人将会移至系统默认分组“我的好友。</div></div>';
  798. str += '<div class="box-btn"> <span onclick="hideRemindBox()">取消</span> <span onclick="submitDeleteGroupAction('+ index + ')">确定</span></div>';
  799. $('.remind-box').append(str);
  800. $('.remind-box').show();
  801. }
  802. }
  803. /**
  804. * 联系人菜单选择
  805. * type:
  806. * 1:移动联系人
  807. * 2:删除联系人
  808. * 3:加入黑名单
  809. * */
  810. function selectLinkmanMenuItem(event, type, index, item_index) {
  811. var chatSessionId = app.groups[index].chatSessionList[item_index].id;
  812. var name = app.groups[index].chatSessionList[item_index].linkmanInfo.userInfo.name;
  813. var ownid = app.gid;
  814. var fromGroupName = app.groups[index].groupName;
  815. if (type == 1) {
  816. var toGroupName = $(event.target).text()
  817. groupService.moveToGroup(chatSessionId, ownid, fromGroupName, toGroupName, function (data) {
  818. reloadData();
  819. drawSessionGroup();
  820. },function (error) {
  821. })
  822. } else if (type == 2) {
  823. $('.remind-box').text('');
  824. var str = '<div class="box-header"><img onclick="hideRemindBox()" src="/style/img/remind-box-del.png" alt="" /></div>';
  825. str += '<div class="box-title"><span>!</span><span>删除后对方将从联系人列表中消失。</span></div>';
  826. str += '<div class="box-info"> <img src="/style/img/photo01.png" alt="" /><span>' + name.substring(0,1)+'**' +'</span> </div>';
  827. str += '<div class="box-btn"> <span onclick="hideRemindBox()">取消</span> <span onclick="submitDeleteAction('+ index + ',' + item_index + ')">确定</span></div>';
  828. $('.remind-box').append(str);
  829. $('.remind-box').show();
  830. } else if (type == 3) {
  831. $('.remind-box').text('');
  832. var str = '<div class="box-header"><img onclick="hideRemindBox()" src="/style/img/remind-box-del.png" alt="" /></div>';
  833. str += '<div class="box-title"><span>!</span><span>确认将该联系人加入至黑名单吗?</span><div>移至黑名单后将无法接收此人会话消息。</div></div>';
  834. str += '<div class="box-info"> <img src="/style/img/photo01.png" alt="" /><span>' + name.substring(0,1)+'**' +'</span> </div>';
  835. str += '<div class="box-btn"> <span onclick="hideRemindBox()">取消</span> <span onclick="submitBlackAction('+ index + ',' + item_index + ')">确定</span></div>';
  836. $('.remind-box').append(str);
  837. $('.remind-box').show();
  838. }
  839. }
  840. /**
  841. * 隐藏分组菜单
  842. * */
  843. function hideRemindBox() {
  844. $('.remind-box').hide();
  845. }
  846. /**
  847. * 确认删除分组
  848. * */
  849. function submitDeleteGroupAction(index) {
  850. var ownid = app.gid;
  851. var groupName = app.groups[index].groupName;
  852. groupService.removeGroup(ownid, groupName, function (data) {
  853. reloadData();
  854. drawSessionGroup();
  855. hideRemindBox();
  856. },function (error) {
  857. alert('删除分组失败!');
  858. })
  859. }
  860. /**
  861. * 确认删除联系人
  862. * */
  863. function submitDeleteAction(index, item_index) {
  864. var chatSessionId = app.groups[index].chatSessionList[item_index].id;
  865. var ownid = app.gid;
  866. var fromGroupName = app.groups[index].groupName;
  867. groupService.removeLinkman(chatSessionId, ownid, fromGroupName, function (data) {
  868. reloadData();
  869. drawSessionGroup();
  870. hideRemindBox();
  871. },function (error) {
  872. alert('删除联系人失败!');
  873. })
  874. }
  875. /**
  876. * 确认加入黑名单
  877. * */
  878. function submitBlackAction(index, item_index) {
  879. var chatSessionId = app.groups[index].chatSessionList[item_index].id;
  880. var ownid = app.gid;
  881. var fromGroupName = app.groups[index].groupName;
  882. groupService.setlinkmanToBlacklist(chatSessionId, ownid, fromGroupName, function (data) {
  883. reloadData();
  884. drawSessionGroup();
  885. hideRemindBox();
  886. },function (error) {
  887. alert('加入黑名单失败!');
  888. })
  889. }
  890. /**
  891. * 隐藏分组菜单
  892. * */
  893. function hideGroupMenu() {
  894. $('.group-menu').hide();
  895. }
  896. /**
  897. * 隐藏分组列表菜单
  898. * */
  899. function hideGroupListMenu() {
  900. $('.group-list-menu').hide();
  901. }
  902. function onAddGroup(event) {
  903. if (event.keyCode && event.keyCode !== 13) {
  904. return;
  905. }
  906. var val = $(event.target).val();
  907. if (!val || val == '') {
  908. $('#session-list .list-group2 .group-list >li:last-child').remove();
  909. } else {
  910. groupService.addGroup(app.gid, val, function (data) {
  911. reloadData();
  912. drawSessionGroup();
  913. }, function (error) {
  914. })
  915. }
  916. }
  917. function onRenameGroup(event, index) {
  918. if (event.keyCode && event.keyCode !== 13) {
  919. return;
  920. }
  921. var _this = $(event.target)
  922. var val = _this.val();
  923. if (!val || val == '') {
  924. _this.prev().show();
  925. _this.remove();
  926. } else {
  927. var groupName = app.groups[index].groupName;
  928. groupService.renameGroup(app.gid, groupName, val, function (data) {
  929. reloadData();
  930. drawSessionGroup();
  931. }, function (error) {
  932. })
  933. }
  934. }
  935. /**
  936. * 搜索联系人
  937. * */
  938. function onSearchLinkman(type) {
  939. if (type && type == 'keyup' && event.keyCode!=13) {
  940. return;
  941. }
  942. searchLinkMan();
  943. }
  944. function searchLinkMan() {
  945. var keyword = $('#session-list .search-user >input').val();
  946. var ownerId = app.gid;
  947. groupService.searchLinkman(keyword, ownerId, function (data) {
  948. app.sessions = handlerSessionData(data.success || []);
  949. drawSessionList(app.sessions);
  950. },function (error) {
  951. })
  952. }
  953. $(window).resize(function () { //当浏览器大小变化时
  954. // alert($(window).height()); //浏览器时下窗口可视区域高度
  955. //alert($(document).height()); //浏览器时下窗口文档的高度
  956. //alert($(document.body).height()); //浏览器时下窗口文档body的高度
  957. //alert($(document.body).outerHeight(true)); //浏览器时下窗口文档body的总高度 包括border padding margin*/
  958. });