PageRenderTime 67ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/web/studio/ASC.Web.Studio/UserControls/Common/SmallChat/js/smallChat.js

https://github.com/dc0d/ONLYOFFICE-Server
JavaScript | 2561 lines | 2352 code | 144 blank | 65 comment | 485 complexity | 5833df017fb0fde8a9ba44cedd27334e MD5 | raw file
Possible License(s): GPL-2.0, MPL-2.0-no-copyleft-exception
  1. /*
  2. (c) Copyright Ascensio System SIA 2010-2014
  3. This program is a free software product.
  4. You can redistribute it and/or modify it under the terms
  5. of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
  6. Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
  7. to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
  8. any third-party rights.
  9. This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty
  10. of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
  11. the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
  12. You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
  13. The interactive user interfaces in modified source and object code versions of the Program must
  14. display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
  15. Pursuant to Section 7(b) of the License you must retain the original Product logo when
  16. distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
  17. trademark law for use of our trademarks.
  18. All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
  19. content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
  20. International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
  21. */
  22. /*
  23. Copyright (c) Ascensio System SIA 2014. All rights reserved.
  24. http://www.teamlab.com
  25. */
  26. var SmallChat = (function () {
  27. var chat = jq.connection.c,
  28. currentAccount = null,
  29. already = false,
  30. bufferStates = {},
  31. offlineBuffer = [],
  32. ONLINE = "online",
  33. AWAY = "away",
  34. NOT_AVAILABLE = "not_available",
  35. OFFLINE = "offline",
  36. NUMBER_ONLINE = 1,
  37. NUMBER_AWAY = 2,
  38. NUMBER_NOT_AVAILABLE = 3,
  39. NUMBER_OFFLINE = 4,
  40. IMAGE_ONLINE = "image_online",
  41. IMAGE_AWAY = "image_away",
  42. IMAGE_NOT_AVAILABLE = "image_not_available",
  43. IMAGE_OFFLINE = "image_offline",
  44. PX = "px",
  45. HEIGHT_OFFSET = 100,
  46. OPEN_USER_DETAIL_LIST_INTERVAL = 650,
  47. PING_TIMEOUT_INTERVAL = 100000,
  48. INT_MAX_VALUE = 2147483647,
  49. SEARCH_CONTACT_INTERVAL = 750,
  50. TITLE_INTERVAL = 400,
  51. ENTER_KEY_CODE = 13,
  52. CONVERSATION_BLOCK_HEIGHT = 300,
  53. CONVERSATION_BLOCK_WIDTH = 282,
  54. LEFT_PANEL_AND_INDENT_WIDTH = 370,
  55. MESSAGE_WINDOW_ITEM_HEIGHT = 21,
  56. currentStatus = ONLINE,
  57. currentImage = IMAGE_ONLINE,
  58. NUMBER_OF_RECENT_MSGS = 10,
  59. oldWindowHeight = jq(window).height(),
  60. oldWindowWidth = jq(window).width(),
  61. originalTitle = null,
  62. isActive = false,
  63. titleTimerId = null,
  64. starsNumber = 1,
  65. soundPath = null,
  66. sendTypingSignalTimeout = null,
  67. typingSignalTimeout = null,
  68. shouldOpenUserDialogs = [],
  69. disableUser = false,
  70. timersForMessages = {},
  71. pingTimerId = null,
  72. flashBlocks = {},
  73. shouldOpenContacts = false,
  74. jabberTalkWindow = null,
  75. initEmoticons = false,
  76. maxDialogNumber = null,
  77. isMobile = jq.browser.mobile,
  78. connectionStartTimer = null,
  79. reloadPage = false,
  80. disconnectCompleted = true,
  81. messageContract = {
  82. i: "Id",
  83. u: "UserName",
  84. t: "Text",
  85. d: "DateTimeText"
  86. },
  87. userStrContract = {
  88. u: "UserName",
  89. d: "DisplayUserName",
  90. s: "State"
  91. },
  92. userInformations = {},
  93. sessionStorageManager = function () {
  94. var isAvailable;
  95. try {
  96. isAvailable = "sessionStorage" in window && window["sessionStorage"] !== null;
  97. } catch (e) {
  98. return { isAvailable: false };
  99. }
  100. var getItem = function (key) {
  101. if (!key) {
  102. return null;
  103. }
  104. return JSON.parse(sessionStorage.getItem(key));
  105. };
  106. var setItem = function (key, value) {
  107. if (!key) {
  108. return;
  109. }
  110. try {
  111. sessionStorage.setItem(key, JSON.stringify(value));
  112. } catch (e) {
  113. if (typeof QUOTA_EXCEEDED_ERR != undefined && e == QUOTA_EXCEEDED_ERR) {
  114. throw "Session storage is full";
  115. }
  116. }
  117. };
  118. var removeItem = function (key) {
  119. if (!key) {
  120. return null;
  121. }
  122. sessionStorage.removeItem(key);
  123. };
  124. var clear = function () {
  125. sessionStorage.clear();
  126. };
  127. return {
  128. isAvailable: isAvailable,
  129. getItem: getItem,
  130. setItem: setItem,
  131. removeItem: removeItem,
  132. clear: clear
  133. };
  134. }();
  135. localStorageManager = function () {
  136. var isAvailable;
  137. try {
  138. isAvailable = "localStorage" in window && window["localStorage"] !== null;
  139. } catch (e) {
  140. return { isAvailable: false };
  141. }
  142. var getItem = function (key) {
  143. if (!key) {
  144. return null;
  145. }
  146. return JSON.parse(localStorage.getItem(key));
  147. };
  148. var setItem = function (key, value) {
  149. if (!key) {
  150. return;
  151. }
  152. try {
  153. localStorage.setItem(key, JSON.stringify(value));
  154. } catch (e) {
  155. if (typeof QUOTA_EXCEEDED_ERR != undefined && e == QUOTA_EXCEEDED_ERR) {
  156. throw "Local storage is full";
  157. }
  158. }
  159. };
  160. var removeItem = function (key) {
  161. if (!key) {
  162. return null;
  163. }
  164. localStorage.removeItem(key);
  165. };
  166. var clear = function () {
  167. localStorage.clear();
  168. };
  169. return {
  170. isAvailable: isAvailable,
  171. getItem: getItem,
  172. setItem: setItem,
  173. removeItem: removeItem,
  174. clear: clear
  175. };
  176. }();
  177. if (Teamlab.profile.id && sessionStorageManager.getItem("currentUserId") != Teamlab.profile.id) {
  178. sessionStorageManager.clear();
  179. sessionStorageManager.setItem("currentUserId", Teamlab.profile.id);
  180. }
  181. if (typeof (chat) !== undefined) {
  182. // initDataRetrieved
  183. chat.client.idr = function (userName, showUserName, users, tenantId, tenantName, path) {
  184. currentAccount = {
  185. TenantName: tenantName,
  186. TenantId: tenantId,
  187. UserName: userName,
  188. ShowUserName: showUserName
  189. };
  190. soundPath = path;
  191. var $userList = jq(".user_list"),
  192. usersOnline = {},
  193. usersAway = {},
  194. usersNotAvailable = {},
  195. usersOffline = {},
  196. stateNumber;
  197. if ($userList.length) {
  198. jq(".user_list").remove();
  199. }
  200. for (var i = 0; i < users.length; i++) {
  201. users[i] = reMap(users[i], userStrContract);
  202. stateNumber = users[i].State;
  203. users[i].State = getImageByNumber(stateNumber);
  204. switch (stateNumber) {
  205. case NUMBER_ONLINE:
  206. usersOnline[i] = users[i];
  207. break;
  208. case NUMBER_AWAY:
  209. usersAway[i] = users[i];
  210. break;
  211. case NUMBER_NOT_AVAILABLE:
  212. usersNotAvailable[i] = users[i];
  213. break;
  214. default:
  215. usersOffline[i] = users[i];
  216. }
  217. }
  218. var tenantGuid = sessionStorageManager.getItem("TenantGuid");
  219. if (!tenantGuid) {
  220. tenantGuid = guid();
  221. sessionStorageManager.setItem("TenantGuid", tenantGuid);
  222. }
  223. var html = jq("#contactListTmpl").tmpl({
  224. UsersOnline: usersOnline,
  225. UsersAway: usersAway,
  226. UsersNotAvailable: usersNotAvailable,
  227. UsersOffline: usersOffline
  228. }),
  229. htmlTenant = jq("#tenantBlockTmpl").tmpl({
  230. TenantGuid: tenantGuid,
  231. TenantName: currentAccount.TenantName
  232. }),
  233. smallChatHeight = sessionStorageManager.getItem("SmallChatHeight");
  234. if (smallChatHeight) {
  235. jq(".small_chat_main_window").css("height", smallChatHeight);
  236. }
  237. jq(".chat_contact_loader").addClass("display-none");
  238. jq(".conversation_block").removeClass("display-none");
  239. jq(html).appendTo(".contact_container");
  240. jq(".contact_container").find(".tenant_user_list").append(htmlTenant);
  241. sessionStorageManager.setItem("WasConnected", true);
  242. searchContact();
  243. var status = sessionStorageManager.getItem("CurrentStatus");
  244. if (status && status != OFFLINE) {
  245. changeStatus(getUserNumberByState(status));
  246. }
  247. for (var un in bufferStates) {
  248. setState(un, bufferStates[un]);
  249. }
  250. bufferStates = {};
  251. for (var i = 0; i < offlineBuffer.length; i++) {
  252. if (offlineBuffer[i] == "") {
  253. offlineBuffer[i] = sessionStorageManager.getItem("TenantGuid");
  254. }
  255. if (isDialogOpen(offlineBuffer[i])) {
  256. closeConversationBlock(offlineBuffer[i]);
  257. }
  258. removeUserInSessionIfExists(offlineBuffer[i]);
  259. openMessageDialog(offlineBuffer[i]);
  260. var result = flashConversationBlock(offlineBuffer[i], true);
  261. if (result) {
  262. flashBlocks[offlineBuffer[i]] = result;
  263. }
  264. }
  265. offlineBuffer = [];
  266. loadMessageDialogs();
  267. jq(".extend_chat_icon").off("click").on("click", extendChat);
  268. ASC.Controls.JabberClient.extendChat = extendChat;
  269. setPingSending();
  270. };
  271. // sendInvite
  272. chat.client.si = function (message) {
  273. message = reMap(message, messageContract);
  274. if (!isDialogOpen(sessionStorageManager.getItem("TenantGuid"))) {
  275. openMessageDialog(sessionStorageManager.getItem("TenantGuid"));
  276. }
  277. putMessage({
  278. IsMessageOfCurrentUser: false,
  279. Name: message.UserName,
  280. DateTime: Teamlab.getDisplayTime(new Date()),
  281. Message: addBr(ASC.Resources.Master.ChatResource.ChatRoomInvite + " " + message.Text + ". " + ASC.Resources.Master.ChatResource.GoTalk),
  282. NotRead: true
  283. }, sessionStorageManager.getItem("TenantGuid"));
  284. };
  285. // send
  286. chat.client.s = function (message, calleeUserName, isTenantUser) {
  287. message = reMap(message, messageContract);
  288. if (currentAccount != null) {
  289. var userName = undefined,
  290. showUserName = undefined,
  291. $document = jq(document),
  292. isMessageOfCurrentUser = undefined;
  293. if (!isTenantUser) {
  294. userName = message.UserName;
  295. isMessageOfCurrentUser = (userName == currentAccount.UserName);
  296. showUserName = isMessageOfCurrentUser ?
  297. currentAccount.ShowUserName :
  298. jq(".contact_block[data-username='" + message.UserName + "']").find(".contact_record").text();
  299. } else {
  300. userName = sessionStorageManager.getItem("TenantGuid");
  301. showUserName = currentAccount.TenantName;
  302. isMessageOfCurrentUser = (userName == currentAccount.UserName);
  303. }
  304. var realUserName = isMessageOfCurrentUser ? calleeUserName : userName;
  305. if (isDialogOpen(userName) || isDialogOpen(calleeUserName)) {
  306. if (!isMessageOfCurrentUser) {
  307. var $conversationBlock = jq(".conversation_block[data-username='" + userName + "']");
  308. hideTypingMessageNotification($conversationBlock, $conversationBlock.find(".message_bus_container"));
  309. }
  310. putMessage({
  311. IsMessageOfCurrentUser: isMessageOfCurrentUser,
  312. Name: showUserName,
  313. DateTime: Teamlab.getDisplayTime(new Date()),
  314. Message: addBr(message.Text),
  315. NotRead: !isMessageOfCurrentUser
  316. }, realUserName);
  317. } else if (isActive && !isMessageOfCurrentUser) {
  318. showMessageNotification({
  319. UserName: userName,
  320. Message: addBr(message.Text),
  321. ShowUserName: showUserName,
  322. });
  323. }
  324. if (!isMessageOfCurrentUser) {
  325. if (!isMobile && soundPath && localStorageManager.getItem("EnableSound")) {
  326. playSound(soundPath);
  327. }
  328. if (!isActive) {
  329. shouldOpenUserDialogs[shouldOpenUserDialogs.length] = userName;
  330. if (!titleTimerId) {
  331. originalTitle = $document.find("title").text();
  332. $document.find("title").text("*" + ASC.Resources.Master.ChatResource.NewMessageLabel + " " + originalTitle);
  333. titleTimerId = setInterval(function () {
  334. starsNumber++;
  335. $document.find("title").text(getStars(starsNumber) +
  336. ASC.Resources.Master.ChatResource.NewMessageLabel + " " + originalTitle);
  337. if (starsNumber == 3) {
  338. starsNumber = 0;
  339. }
  340. }, TITLE_INTERVAL);
  341. }
  342. }
  343. } else {
  344. openMessageDialog(calleeUserName);
  345. }
  346. }
  347. };
  348. // sendOfflineMessages
  349. chat.client.som = function (userNames) {
  350. offlineBuffer = userNames;
  351. if (currentAccount && sessionStorageManager.getItem("WasConnected")) {
  352. for (var i = 0; i < offlineBuffer.length; i++) {
  353. if (offlineBuffer[i] == "") {
  354. offlineBuffer[i] = sessionStorageManager.getItem("TenantGuid");
  355. }
  356. if (isDialogOpen(offlineBuffer[i])) {
  357. closeConversationBlock(offlineBuffer[i]);
  358. }
  359. removeUserInSessionIfExists(offlineBuffer[i]);
  360. openMessageDialog(offlineBuffer[i]);
  361. var result = flashConversationBlock(offlineBuffer[i], true);
  362. if (result) {
  363. flashBlocks[offlineBuffer[i]] = result;
  364. }
  365. }
  366. offlineBuffer = [];
  367. }
  368. };
  369. // sendTypingSignal
  370. chat.client.sts = function (userName) {
  371. if (isDialogOpen(userName)) {
  372. var $conversationBlock = jq(".conversation_block[data-username='" + userName + "']"),
  373. $typingMessageNotification = $conversationBlock.find(".typing_message_notification");
  374. if ($typingMessageNotification.hasClass("display-none")) {
  375. $messageBusContainer = $conversationBlock.find(".message_bus_container");
  376. $typingMessageNotification.css("bottom", $conversationBlock.find(".message_input_area").outerHeight() + PX);
  377. $typingMessageNotification.removeClass("display-none");
  378. }
  379. if (typingSignalTimeout) {
  380. clearTimeout(typingSignalTimeout);
  381. typingSignalTimeout = null;
  382. }
  383. typingSignalTimeout = setTimeout(function () {
  384. hideTypingMessageNotification($conversationBlock, $conversationBlock.find(".message_bus_container"));
  385. }, 5000);
  386. }
  387. };
  388. // setState
  389. chat.client.ss = function (userName, stateNumber, isJabberClient) {
  390. if (currentAccount != null) {
  391. setState(userName, stateNumber, isJabberClient);
  392. } else {
  393. bufferStates[userName] = stateNumber;
  394. }
  395. };
  396. // statesRetrieved
  397. chat.client.sr = function (states) {
  398. var keys = Object.keys(states),
  399. status = sessionStorageManager.getItem("CurrentStatus"),
  400. $conversationBlocks = jq(".conversation_block"),
  401. $chatMessagesLoading,
  402. $conversationBlock;
  403. $conversationBlocks.removeClass("display-none");
  404. for (var i = 0; i < keys.length; i++) {
  405. setState(keys[i], states[keys[i]]);
  406. }
  407. sessionStorageManager.setItem("WasConnected", true);
  408. for (var i = 0; i < $conversationBlocks.length; i++) {
  409. $conversationBlock = jq($conversationBlocks[i]);
  410. if (!$conversationBlock.find(".chat_messages_loading").hasClass("display-none")) {
  411. getRecentMessagesOnStart($conversationBlock.attr("data-username"));
  412. }
  413. }
  414. if (status && status != OFFLINE) {
  415. changeStatus(getUserNumberByState(status));
  416. }
  417. for (var userName in bufferStates) {
  418. setState(userName, bufferStates[userName]);
  419. }
  420. searchContact();
  421. bufferStates = {};
  422. for (var i = 0; i < offlineBuffer.length; i++) {
  423. if (offlineBuffer[i] == "") {
  424. offlineBuffer[i] = sessionStorageManager.getItem("TenantGuid");
  425. }
  426. if (isDialogOpen(offlineBuffer[i])) {
  427. closeConversationBlock(offlineBuffer[i]);
  428. }
  429. openMessageDialog(offlineBuffer[i]);
  430. var result = flashConversationBlock(offlineBuffer[i], true);
  431. if (result) {
  432. flashBlocks[offlineBuffer[i]] = result;
  433. }
  434. }
  435. offlineBuffer = [];
  436. jq(".extend_chat_icon").off("click").on("click", extendChat);
  437. ASC.Controls.JabberClient.extendChat = extendChat;
  438. setPingSending();
  439. };
  440. // setStatus
  441. chat.client.sst = function (number) {
  442. changeStatus(number);
  443. };
  444. // error
  445. chat.client.e = function () {
  446. showErrorNotification();
  447. connectionStop();
  448. closeChat();
  449. };
  450. } else {
  451. throw "Error! Chat proxy is undefined!!!";
  452. }
  453. function getRecentMessagesOnStart(u) {
  454. var userName = u;
  455. chat.server.grm(userName == sessionStorageManager.getItem("TenantGuid") ? "" : userName, INT_MAX_VALUE).done(function (recentMessages) {
  456. var $cb = jq(".conversation_block[data-username='" + userName + "']"),
  457. $chatLoading = $cb.find(".chat_messages_loading");
  458. receiveRecentMessages(userName, recentMessages, $chatLoading, $cb, 0);
  459. });
  460. }
  461. function removeUserInSessionIfExists(currentUserName) {
  462. var dialogsNumber = sessionStorageManager.getItem("dialogsNumber");
  463. for (var i = 0; i < dialogsNumber; i++) {
  464. if (currentUserName == sessionStorageManager.getItem("userName" + i)) {
  465. for (var j = i; j < dialogsNumber; j++) {
  466. sessionStorageManager.setItem("userName" + j, sessionStorageManager.getItem("userName" + (j + 1)));
  467. }
  468. sessionStorageManager.removeItem("userName" + dialogsNumber - 1);
  469. sessionStorageManager.setItem("dialogsNumber", dialogsNumber - 1);
  470. break;
  471. }
  472. }
  473. }
  474. function s4() {
  475. return (0 | ((1 + Math.random()) * 0x10000)).toString(16).substring(1);
  476. }
  477. function guid() {
  478. return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
  479. }
  480. function setPingSending() {
  481. if (pingTimerId) {
  482. clearInterval(pingTimerId);
  483. }
  484. pingTimerId = setInterval(function () {
  485. if (sessionStorageManager.getItem("WasConnected")) {
  486. // ping
  487. chat.server.p();
  488. } else {
  489. clearInterval(pingTimerId);
  490. pingTimerId = null;
  491. }
  492. }, PING_TIMEOUT_INTERVAL);
  493. }
  494. function hideTypingMessageNotification(conversationBlock, messageBusContainer) {
  495. jq(conversationBlock).find(".typing_message_notification").addClass("display-none");
  496. jq(messageBusContainer).css({ "height": "100%", "padding-bottom": "0" });
  497. if (typingSignalTimeout) {
  498. clearTimeout(typingSignalTimeout);
  499. typingSignalTimeout = null;
  500. }
  501. }
  502. function getStars(starsNumber) {
  503. switch (starsNumber) {
  504. case 1: return "*";
  505. case 2: return "**";
  506. case 3: return "***";
  507. }
  508. }
  509. function loadMessageDialogs() {
  510. var userName,
  511. dialogsNumber = sessionStorageManager.getItem("dialogsNumber"),
  512. dialogsNumberInMenu = sessionStorageManager.getItem("dialogsNumberInMenu");
  513. if (dialogsNumber) {
  514. for (var i = 0; i < dialogsNumber; i++) {
  515. userName = sessionStorageManager.getItem("userName" + i);
  516. openMessageDialog(userName, true, i);
  517. // if user was disabled
  518. if (disableUser) {
  519. i--;
  520. dialogsNumber--;
  521. disableUser = false;
  522. }
  523. if (sessionStorageManager.getItem("MiniCB" + userName)) {
  524. minimize(jq(".conversation_block[data-username='" + userName + "']"));
  525. }
  526. }
  527. }
  528. if (dialogsNumberInMenu) {
  529. for (var i = 0; i < dialogsNumberInMenu; i++) {
  530. userName = sessionStorageManager.getItem("dn_userName" + i);
  531. var $contactRecord = jq(".contact_block[data-username='" + userName + "']").find(".contact_record");
  532. // if user was disabled
  533. if (!$contactRecord.length) {
  534. sessionStorageManager.setItem("dialogsNumberInMenu", dialogsNumberInMenu - 1);
  535. for (var j = i; j < dialogsNumberInMenu - 1; j++) {
  536. sessionStorageManager.setItem("dn_userName" + j, sessionStorageManager.getItem("dn_userName" + (j + 1)));
  537. }
  538. sessionStorageManager.removeItem("dn_userName" + (dialogsNumberInMenu - 1));
  539. i--;
  540. dialogsNumberInMenu--;
  541. continue;
  542. }
  543. addToMenu({
  544. UserName: userName,
  545. ShowUserName: $contactRecord.text(),
  546. }, true);
  547. }
  548. // if user was disabled
  549. if (getMaxDialogNumber() > sessionStorageManager.getItem("dialogsNumber")) {
  550. userName = jq("#messageDialogPopupID").find(".message_dialog_item").first().attr("data-username");
  551. closeMessageDialogItem(userName);
  552. openMessageDialog(userName);
  553. }
  554. }
  555. jq(".message_input_area").blur();
  556. }
  557. function isDialogOpen(userName) {
  558. if (jq(".conversation_block[data-username='" + userName + "']").length) {
  559. return true;
  560. }
  561. return false;
  562. }
  563. function isDialogInMenu(userName) {
  564. if (jq(".message_dialog_item[data-username='" + userName + "']").length) {
  565. return true;
  566. }
  567. return false;
  568. }
  569. function removeParametersOfDialogInMenu(userName) {
  570. var $block = jq(".message_dialog_item[data-username='" + userName + "']"),
  571. $items = jq(".message_dialog_item"),
  572. dialogsNumberInMenu = sessionStorageManager.getItem("dialogsNumberInMenu") - 1,
  573. $messageDialogItem = jq(".message_dialog_item");
  574. for (var i = 0; i < $messageDialogItem.length; i++) {
  575. var nextIndex = $items.index($messageDialogItem[i]);
  576. if ($items.index($block) < nextIndex) {
  577. sessionStorageManager.setItem("dn_userName" + (nextIndex - 1),
  578. sessionStorageManager.getItem("dn_userName" + nextIndex));
  579. }
  580. }
  581. $block.remove();
  582. sessionStorageManager.removeItem("dn_userName" + dialogsNumberInMenu);
  583. sessionStorageManager.setItem("dialogsNumberInMenu", dialogsNumberInMenu);
  584. }
  585. function setParametersOfDialog(userName) {
  586. var dialogsNumber = sessionStorageManager.getItem("dialogsNumber");
  587. if (dialogsNumber) {
  588. sessionStorageManager.setItem("userName" + dialogsNumber, userName);
  589. jq(".conversation_block[data-username='" + userName + "']").attr("data-dialog-number", dialogsNumber);
  590. sessionStorageManager.setItem("dialogsNumber", ++dialogsNumber);
  591. } else {
  592. sessionStorageManager.setItem("userName0", userName);
  593. jq(".conversation_block[data-username='" + userName + "']").attr("data-dialog-number", "0");
  594. sessionStorageManager.setItem("dialogsNumber", 1);
  595. }
  596. }
  597. function setParametersOfDialogInMenu(userName) {
  598. var dialogsNumberInMenu = sessionStorageManager.getItem("dialogsNumberInMenu");
  599. if (dialogsNumberInMenu) {
  600. sessionStorageManager.setItem("dn_userName" + dialogsNumberInMenu, userName);
  601. sessionStorageManager.setItem("dialogsNumberInMenu", ++dialogsNumberInMenu);
  602. } else {
  603. sessionStorageManager.setItem("dn_userName0", userName);
  604. sessionStorageManager.setItem("dialogsNumberInMenu", 1);
  605. }
  606. }
  607. function getContactNumberBeforeCurrent(name, ulClass) {
  608. var $lists = jq("." + ulClass).children();
  609. for (var i = 0; i < $lists.length; i++) {
  610. if (name <= jq($lists[i]).find(".contact_record").text().toLowerCase()) {
  611. break;
  612. }
  613. }
  614. return i;
  615. }
  616. function setState(userName, stateNumber, isJabberClient) {
  617. if (userName != currentAccount.UserName) {
  618. var newState = getImageByNumber(stateNumber),
  619. $contactBlock = jq(".contact_block[data-username='" + userName + "']"),
  620. ulClass;
  621. if ($contactBlock.length) {
  622. var $elem = $contactBlock.find(".chat_user_state");
  623. if ($elem.attr("class") != undefined) {
  624. var oldState = $elem.attr("class").split(" ")[1];
  625. $elem.removeClass(oldState);
  626. $elem.addClass(newState);
  627. $contactBlock.detach();
  628. switch (stateNumber) {
  629. case NUMBER_ONLINE:
  630. ulClass = "online_user_list";
  631. break;
  632. case NUMBER_AWAY:
  633. ulClass = "away_user_list";
  634. break;
  635. case NUMBER_NOT_AVAILABLE:
  636. ulClass = "not_available_user_list";
  637. break;
  638. default:
  639. ulClass = "offline_user_list";
  640. }
  641. var contactNumber = getContactNumberBeforeCurrent($contactBlock.find(".contact_record").text().toLowerCase(), ulClass);
  642. if (contactNumber) {
  643. $contactBlock.insertAfter("." + ulClass + " li:nth-child(" + contactNumber + ")");
  644. } else {
  645. $contactBlock.prependTo("." + ulClass);
  646. }
  647. }
  648. } else {
  649. if (sessionStorageManager.getItem("WasConnected")) {
  650. // getContactInfo
  651. chat.server.gci(userName).done(function (contact) {
  652. switch (contact.Item2) {
  653. case NUMBER_ONLINE:
  654. ulClass = "online_user_list";
  655. break;
  656. case NUMBER_AWAY:
  657. ulClass = "away_user_list";
  658. break;
  659. case NUMBER_NOT_AVAILABLE:
  660. ulClass = "not_available_user_list";
  661. break;
  662. default:
  663. ulClass = "offline_user_list";
  664. }
  665. createContactInfo({
  666. UserName: userName,
  667. ShowUserName: contact.Item1,
  668. StateClass: ulClass
  669. }, ulClass);
  670. }).fail(function (error) {
  671. showErrorNotification();
  672. });
  673. }
  674. }
  675. if (isDialogOpen(userName)) {
  676. var $stateBlock = jq(".conversation_block[data-username='" + userName + "']").find(".conversation_block_user_state");
  677. if ($stateBlock.attr("class") != undefined) {
  678. var oldState = $stateBlock.attr("class").split(" ")[1];
  679. $stateBlock.removeClass(oldState);
  680. $stateBlock.addClass(newState);
  681. $stateBlock.attr("title", getRealStateByNumber(stateNumber));
  682. }
  683. }
  684. } else if (!isJabberClient) {
  685. changeStatus(stateNumber);
  686. }
  687. }
  688. function createContactInfo(contact, ulClass) {
  689. var contactNumber = getContactNumberBeforeCurrent(contact.UserName, ulClass),
  690. html = jq("#contactTmpl").tmpl(contact);
  691. if (contactNumber) {
  692. html.insertAfter("." + ulClass + " li:nth-child(" + contactNumber + ")");
  693. } else {
  694. html.prependTo("." + ulClass);
  695. }
  696. }
  697. function changeStatus(stateNumber, NoIconGreen) {
  698. var state = getUserStateByNumber(stateNumber);
  699. if (state != currentStatus) {
  700. var prevStatus = currentStatus,
  701. $showSmallChatIcon = jq(".show_small_chat_icon"),
  702. $smallChatPopupID = jq("#smallChatPopupID"),
  703. $smallChatTextStatus = jq(".small_chat_text_status"),
  704. $currentStatus = jq("." + currentStatus),
  705. realStatus;
  706. $smallChatPopupID.removeClass("display_block");
  707. $smallChatPopupID.addClass("display-none");
  708. $currentStatus.removeClass("disable");
  709. $smallChatTextStatus.removeClass(currentImage);
  710. $currentStatus.click(chooseStatus);
  711. if (state == OFFLINE) {
  712. $showSmallChatIcon.addClass("small_chat_icon_white");
  713. $showSmallChatIcon.removeClass("small_chat_icon_green");
  714. connectionStop();
  715. } else if (!NoIconGreen) {
  716. $showSmallChatIcon.addClass("small_chat_icon_green");
  717. $showSmallChatIcon.removeClass("small_chat_icon_white");
  718. }
  719. currentImage = getImageByNumber(stateNumber);
  720. currentStatus = state;
  721. sessionStorageManager.setItem("CurrentStatus", currentStatus);
  722. $currentStatus = jq("." + currentStatus);
  723. $currentStatus.off("click");
  724. $currentStatus.addClass("disable");
  725. $smallChatTextStatus.addClass(currentImage);
  726. realStatus = getRealState(currentStatus);
  727. $smallChatTextStatus.text(realStatus);
  728. jq("small_chat_status_menu").attr("title", realStatus);
  729. }
  730. }
  731. function showMessageNotification(object) {
  732. noty({
  733. text: jq("#messageNotificationTmpl").tmpl(object),
  734. layout: "bottomRight",
  735. theme: "defaultTheme",
  736. type: "alert",
  737. animation: {
  738. easing: "swing",
  739. open: { "height": "toggle" },
  740. close: { "height": "toggle" },
  741. speed: "400",
  742. },
  743. timeout: "7000",
  744. maxVisible: 7,
  745. force: true
  746. });
  747. }
  748. function putMessage(object, userName) {
  749. var $conversationBlock = jq(".conversation_block[data-username='" + userName + "']"),
  750. $messageBusContainer = $conversationBlock.find(".message_bus_container"),
  751. $last = $messageBusContainer.find(".message_of_user:last");
  752. if ((($last.hasClass("message_of_other_user") && object.IsMessageOfCurrentUser) ||
  753. ($last.hasClass("message_of_current_user") && !object.IsMessageOfCurrentUser)) &&
  754. timersForMessages[userName]) {
  755. clearTimeout(timersForMessages[userName]);
  756. delete timersForMessages[userName];
  757. }
  758. if (!object.IsMessageOfCurrentUser && !(userName in flashBlocks)) {
  759. var result = flashConversationBlock(userName, true);
  760. if (result) {
  761. flashBlocks[userName] = result;
  762. }
  763. }
  764. if (!timersForMessages[userName]) {
  765. $messageBusContainer.append(jq("#messageTmpl").tmpl(object));
  766. $last = $messageBusContainer.find(".message_of_user:last");
  767. } else {
  768. $last.next().text(object.DateTime);
  769. $last.after("<div class='message_of_user " +
  770. ($last.hasClass("message_of_current_user") ? "message_of_current_user" : "message_of_other_user not_read_message") +
  771. "'>" + object.Message + "</div>");
  772. clearTimeout(timersForMessages[userName]);
  773. delete timersForMessages[userName];
  774. }
  775. timersForMessages[userName] = setTimeout(function () {
  776. clearTimeout(timersForMessages[userName]);
  777. delete timersForMessages[userName];
  778. }, 30000);
  779. $last = $messageBusContainer.find(".message_of_user:last");
  780. if (userName != sessionStorageManager.getItem("TenantGuid")) {
  781. emoticonize($last);
  782. }
  783. $last.linkify();
  784. scrollTopMessageContainer($messageBusContainer);
  785. }
  786. function scrollTopMessageContainer(messageBusContainer) {
  787. var $messageBusContainer = jq(messageBusContainer);
  788. scrollHeight = $messageBusContainer.prop("scrollHeight");
  789. if (scrollHeight > $messageBusContainer.scrollTop() && scrollHeight > $messageBusContainer.height()) {
  790. $messageBusContainer.scrollTop(scrollHeight);
  791. }
  792. }
  793. function putSmileInMessage(e) {
  794. var $smile = jq(e.currentTarget),
  795. $smileMenu = jq(".smile_menu"),
  796. dn = $smileMenu.attr("id").split("smilesPopupID")[1],
  797. $conversationBlock = jq(".conversation_block[data-dialog-number='" + dn + "']"),
  798. $messageInputArea = $conversationBlock.find(".message_input_area"),
  799. cursorPos = $messageInputArea.prop("selectionStart"),
  800. v = $messageInputArea.val(),
  801. smileString = " " + $smile.text();
  802. $messageInputArea.val(v.substring(0, cursorPos) + smileString + v.substring(cursorPos, v.length));
  803. $messageInputArea.val($messageInputArea.val() + " ");
  804. setCaretPosition($messageInputArea, cursorPos + smileString.length);
  805. $messageInputArea.trigger("autosize.resize");
  806. $messageInputArea.scrollTop($messageInputArea.prop("scrollHeight"));
  807. sendTypingSignal($conversationBlock.attr("data-username"));
  808. $smileMenu.css("display", "none");
  809. }
  810. function getRealState(state) {
  811. switch (state) {
  812. case ONLINE:
  813. return ASC.Resources.Master.ChatResource.StatusOnline;
  814. case AWAY:
  815. return ASC.Resources.Master.ChatResource.StatusAway;
  816. case NOT_AVAILABLE:
  817. return ASC.Resources.Master.ChatResource.StatusNA;
  818. default:
  819. return ASC.Resources.Master.ChatResource.StatusOffline;
  820. }
  821. }
  822. function getRealStateByNumber(stateNumber) {
  823. switch (stateNumber) {
  824. case NUMBER_ONLINE:
  825. return ASC.Resources.Master.ChatResource.StatusOnline;
  826. case NUMBER_AWAY:
  827. return ASC.Resources.Master.ChatResource.StatusAway;
  828. case NUMBER_NOT_AVAILABLE:
  829. return ASC.Resources.Master.ChatResource.StatusNA;
  830. default:
  831. return ASC.Resources.Master.ChatResource.StatusOffline;
  832. }
  833. }
  834. function getRealStateByImageState(stateNumber) {
  835. switch (stateNumber) {
  836. case IMAGE_ONLINE:
  837. return ASC.Resources.Master.ChatResource.StatusOnline;
  838. case IMAGE_AWAY:
  839. return ASC.Resources.Master.ChatResource.StatusAway;
  840. case IMAGE_NOT_AVAILABLE:
  841. return ASC.Resources.Master.ChatResource.StatusNA;
  842. default:
  843. return ASC.Resources.Master.ChatResource.StatusOffline;
  844. }
  845. }
  846. function getUserStateByImageState(imageState) {
  847. switch (imageState) {
  848. case IMAGE_ONLINE:
  849. return ONLINE;
  850. case IMAGE_AWAY:
  851. return AWAY;
  852. case IMAGE_NOT_AVAILABLE:
  853. return NOT_AVAILABLE;
  854. default:
  855. return OFFLINE;
  856. }
  857. }
  858. function getImageByNumber(stateNumber) {
  859. switch (stateNumber) {
  860. case NUMBER_ONLINE:
  861. return IMAGE_ONLINE;
  862. case NUMBER_AWAY:
  863. return IMAGE_AWAY;
  864. case NUMBER_NOT_AVAILABLE:
  865. return IMAGE_NOT_AVAILABLE;
  866. default:
  867. return IMAGE_OFFLINE;
  868. }
  869. }
  870. function getUserStateByNumber(stateNumber) {
  871. switch (stateNumber) {
  872. case NUMBER_ONLINE:
  873. return ONLINE;
  874. case NUMBER_AWAY:
  875. return AWAY;
  876. case NUMBER_NOT_AVAILABLE:
  877. return NOT_AVAILABLE;
  878. default:
  879. return OFFLINE;
  880. }
  881. }
  882. function getUserNumberByState(state) {
  883. switch (state) {
  884. case ONLINE:
  885. return NUMBER_ONLINE;
  886. case AWAY:
  887. return NUMBER_AWAY;
  888. case NOT_AVAILABLE:
  889. return NUMBER_NOT_AVAILABLE;
  890. default:
  891. return NUMBER_OFFLINE;
  892. }
  893. }
  894. function getUserNumberByStateForConnection() {
  895. var state = getUserNumberByState(sessionStorageManager.getItem("CurrentStatus"));
  896. if (!state || state == NUMBER_OFFLINE) {
  897. state = NUMBER_ONLINE;
  898. }
  899. return state;
  900. }
  901. function openUserDetailList(e) {
  902. if (isMobile) {
  903. return;
  904. }
  905. closeUserDetailList();
  906. if (sessionStorageManager.getItem("WasConnected")) {
  907. var $contactBlock = jq(e.currentTarget),
  908. userName = $contactBlock.attr("data-username");
  909. if (!$contactBlock.is(":hover") || userName == sessionStorageManager.getItem("TenantGuid")) {
  910. return;
  911. }
  912. var timeoutId = setTimeout(function () {
  913. if (!$contactBlock.is(":hover") || !sessionStorageManager.getItem("WasConnected")) {
  914. return;
  915. }
  916. var $detailUserList = jq(".detail_user_list");
  917. if ($detailUserList.length) {
  918. $detailUserList.remove();
  919. }
  920. if (userInformations[userName]) {
  921. openDetail(userName, userInformations[userName], $contactBlock);
  922. } else {
  923. Teamlab.getProfile({}, userName, {
  924. success: function (params, data) {
  925. var departments = {};
  926. if (data.groups) {
  927. for (var i = 0; i < data.groups.length; i++) {
  928. departments[data.groups[i].id] = data.groups[i].name;
  929. }
  930. }
  931. userInformation = {
  932. UserName: userName,
  933. ShowUserName: data.displayName,
  934. Email: data.email,
  935. UserType: data.isVisitor ? ASC.Resources.Master.Guest : ASC.Resources.Master.User,
  936. Title: data.title,
  937. PhotoURL: data.avatar,
  938. Departments: departments
  939. };
  940. userInformations[userName] = userInformation;
  941. openDetail(userName, userInformation, $contactBlock);
  942. }
  943. });
  944. }
  945. }, OPEN_USER_DETAIL_LIST_INTERVAL);
  946. $contactBlock.data("timeoutId", timeoutId);
  947. }
  948. }
  949. function openDetail(userName, data, $contactBlock) {
  950. if (!jq($contactBlock).is(":hover")) {
  951. return;
  952. }
  953. if (data) {
  954. var html = jq("#detailUserListTmpl").tmpl(data),
  955. $detailUserList = jq(html).appendTo(".mainPageTableSidePanel"),
  956. positionOfContact = jq(".contact_block[data-username='" + userName + "']").offset(),
  957. top = positionOfContact.top - 30,
  958. $window = jq(window),
  959. scrollTop = $window.scrollTop();
  960. $detailUserList.css("left", positionOfContact.left + 220 + PX);
  961. if (top + $detailUserList.outerHeight(true) < $window.height() + scrollTop) {
  962. $detailUserList.css("top", top - scrollTop + PX);
  963. } else {
  964. $detailUserList.css("bottom", 15 + PX);
  965. }
  966. $detailUserList.fadeIn(170);
  967. $detailUserList.removeClass("display-none");
  968. }
  969. }
  970. function closeUserDetailList(e) {
  971. if (isMobile) {
  972. return;
  973. }
  974. if (sessionStorageManager.getItem("WasConnected")) {
  975. setTimeout(function () {
  976. var $detailUserList = jq(".detail_user_list");
  977. if (e) {
  978. clearTimeout(jq(e.currentTarget).data("timeoutId"));
  979. }
  980. if ($detailUserList.length && !$detailUserList.hasClass("hover")) {
  981. $detailUserList.fadeOut(100);
  982. }
  983. }, 50);
  984. }
  985. }
  986. function showChat() {
  987. var smallChatHeight = sessionStorageManager.getItem("SmallChatHeight"),
  988. $showSmallChatIcon = jq(".show_small_chat_icon"),
  989. $smallChatMainWindow = jq(".small_chat_main_window");
  990. jq(".extend_chat_icon").off("click");
  991. ASC.Controls.JabberClient.extendChat = function () { ASC.Controls.JabberClient.open(); }
  992. sessionStorageManager.setItem("WasLoad", true);
  993. $smallChatMainWindow.addClass("small_chat_main_window_full");
  994. $showSmallChatIcon.addClass("small_chat_icon_green");
  995. $showSmallChatIcon.removeClass("small_chat_icon_white");
  996. jq(".contact_container").removeClass("display-none");
  997. jq(".small_chat_top_panel").removeClass("display-none");
  998. jq(".icon_ch_size").removeClass("display-none");
  999. resizeChat();
  1000. jq(".conversation_block").removeClass("display-none");
  1001. jq(".message_dialog_btn").removeClass("display-none");
  1002. if (smallChatHeight) {
  1003. $smallChatMainWindow.css("height", smallChatHeight);
  1004. }
  1005. if (!currentAccount) {
  1006. jq(".chat_contact_loader").removeClass("display-none");
  1007. }
  1008. if (currentStatus == OFFLINE) {
  1009. chooseUserStatus(ONLINE);
  1010. }
  1011. }
  1012. function closeChat() {
  1013. var smallChatHeight = sessionStorageManager.getItem("SmallChatHeight"),
  1014. $showSmallChatIcon = jq(".show_small_chat_icon"),
  1015. $smallChatMainWindow = jq(".small_chat_main_window"),
  1016. $notifications = jq(".notification_username"),
  1017. $noRemove = jq(".chat_contact_loader"),
  1018. $contactContainer = jq(".contact_container");
  1019. sessionStorageManager.setItem("WasConnected", false);
  1020. sessionStorageManager.setItem("WasLoad", false);
  1021. var dialogsNumber = sessionStorageManager.getItem("dialogsNumber"),
  1022. dialogsNumberInMenu = sessionStorageManager.getItem("dialogsNumberInMenu") || 0;
  1023. for (var i = 0; i < dialogsNumber; i++) {
  1024. sessionStorageManager.removeItem("userName" + i);
  1025. }
  1026. for (var i = 0; i < dialogsNumberInMenu; i++) {
  1027. sessionStorageManager.removeItem("dn_userName");
  1028. }
  1029. sessionStorageManager.setItem("dialogsNumber", 0);
  1030. sessionStorageManager.setItem("dialogsNumberInMenu", 0);
  1031. jq(".conversation_block").remove();
  1032. jq(".message_dialog_btn").remove();
  1033. jq(".detail_user_list").remove();
  1034. $contactContainer.empty();
  1035. $contactContainer.html($noRemove);
  1036. currentAccount = null;
  1037. if ($notifications.length) {
  1038. for (var i = 0; i < $notifications.length; i++) {
  1039. jq($notifications[i]).closest("li").remove();
  1040. }
  1041. }
  1042. if (smallChatHeight) {
  1043. $smallChatMainWindow.css("height", "initial");
  1044. }
  1045. $smallChatMainWindow.removeClass("small_chat_main_window_full");
  1046. $showSmallChatIcon.addClass("small_chat_icon_white");
  1047. $showSmallChatIcon.removeClass("small_chat_icon_green");
  1048. jq(".contact_container").addClass("display-none");
  1049. jq(".small_chat_top_panel").addClass("display-none");
  1050. jq(".icon_ch_size").addClass("display-none");
  1051. if (!isMobile) {
  1052. $smallChatMainWindow.resizable("disable").removeClass("ui-state-disabled");
  1053. }
  1054. //restore default state
  1055. changeStatus(NUMBER_ONLINE, true);
  1056. }
  1057. function hideChat() {
  1058. var smallChatHeight = sessionStorageManager.getItem("SmallChatHeight"),
  1059. $showSmallChatIcon = jq(".show_small_chat_icon"),
  1060. $smallChatMainWindow = jq(".small_chat_main_window");
  1061. if (smallChatHeight) {
  1062. $smallChatMainWindow.css("height", "initial");
  1063. }
  1064. $smallChatMainWindow.removeClass("small_chat_main_window_full");
  1065. $showSmallChatIcon.addClass("small_chat_icon_white");
  1066. $showSmallChatIcon.removeClass("small_chat_icon_green");
  1067. jq(".contact_container").addClass("display-none");
  1068. jq(".small_chat_top_panel").addClass("display-none");
  1069. jq(".icon_ch_size").addClass("display-none");
  1070. if (!isMobile) {
  1071. $smallChatMainWindow.resizable("disable").removeClass("ui-state-disabled");
  1072. }
  1073. jq(".conversation_block").addClass("display-none");
  1074. jq(".message_dialog_btn").addClass("display-none");
  1075. jq(".detail_user_list").remove();
  1076. //restore default state
  1077. changeStatus(NUMBER_ONLINE, true);
  1078. }
  1079. function showOrHideSmallChat() {
  1080. if (!sessionStorageManager.getItem("WasConnected") && currentStatus != OFFLINE) {
  1081. if (jq.connection.hub.state === jq.connection.connectionState.connected) {
  1082. connectionStart();
  1083. showChat();
  1084. }
  1085. } else {
  1086. connectionStop();
  1087. hideChat();
  1088. }
  1089. }
  1090. function openContacts() {
  1091. if (shouldOpenContacts) {
  1092. shouldOpenContacts = false;
  1093. var dialogsNumber = sessionStorageManager.getItem("dialogsNumber"),
  1094. dialogsNumberInMenu = sessionStorageManager.getItem("dialogsNumberInMenu") || 0,
  1095. allDialogsNumber = dialogsNumber + dialogsNumberInMenu,
  1096. userName;
  1097. for (var i = 0; i < dialogsNumber; i++) {
  1098. userName = sessionStorageManager.getItem("userName" + i);
  1099. if (userName == sessionStorageManager.getItem("TenantGuid")) {
  1100. ASC.Controls.JabberClient.openTenant(currentAccount.TenantName);
  1101. } else {
  1102. ASC.Controls.JabberClient.openContact(userName);
  1103. }
  1104. }
  1105. for (var i = dialogsNumber; i < allDialogsNumber; i++) {
  1106. userName = sessionStorageManager.getItem("dn_userName" + (i - dialogsNumber));
  1107. if (userName == sessionStorageManager.getItem("TenantGuid")) {
  1108. ASC.Controls.JabberClient.openTenant(currentAccount.TenantName);
  1109. } else {
  1110. ASC.Controls.JabberClient.openContact(userName);
  1111. }
  1112. }
  1113. }
  1114. }
  1115. function extendChat() {
  1116. if (!jabberTalkWindow || jabberTalkWindow.closed) {
  1117. jabberTalkWindow = ASC.Controls.JabberClient.open();
  1118. if (!sessionStorageManager.getItem("WasConnected") && currentStatus != OFFLINE) {
  1119. shouldOpenContacts = false;
  1120. } else {
  1121. shouldOpenContacts = true;
  1122. }
  1123. setTimeout(function () {
  1124. if (sessionStorageManager.getItem("WasConnected")) {
  1125. connectionStop();
  1126. }
  1127. if (sessionStorageManager.getItem("WasLoad")) {
  1128. hideChat();
  1129. }
  1130. }, 100);
  1131. }
  1132. }
  1133. function putMessages(recentMessages, userName) {
  1134. var $conversationBlock = jq(".conversation_block[data-username='" + userName + "']"),
  1135. $messageBusContainer = $conversationBlock.find(".message_bus_container"),
  1136. messages = [],
  1137. $allMessageBlocks = undefined,
  1138. isCurrentAccount;
  1139. if (recentMessages.length != NUMBER_OF_RECENT_MSGS) {
  1140. $conversationBlock.attr("data-internal-id", "stop");
  1141. } else if (recentMessages[0]) {
  1142. $conversationBlock.attr("data-internal-id", recentMessages[0].Id);
  1143. }
  1144. var todayDate = new Date();
  1145. for (var i = 0; i < recentMessages.length; i++) {
  1146. isCurrentAccount = recentMessages[i].UserName == currentAccount.UserName;
  1147. var date = Teamlab.serializeDate(recentMessages[i].DateTimeText);
  1148. messages[i] = {
  1149. IsMessageOfCurrentUser: isCurrentAccount,
  1150. Name: isCurrentAccount ? currentAccount.ShowUserName :
  1151. $conversationBlock.find(".header_of_conversation_block").text(),
  1152. DateTime: new Date(date.valueOf()).setHours(0, 0, 0, 0) == todayDate.setHours(0, 0, 0, 0) ?
  1153. Teamlab.getDisplayTime(date) : Teamlab.getDisplayDatetime(date),
  1154. Message: addBr(recentMessages[i].Text),
  1155. Emoticon: true
  1156. }
  1157. }
  1158. var html = jq("#messagesTmpl").tmpl({
  1159. Messages: messages
  1160. });
  1161. $messageBusContainer.find(".chat_messages_loading").after(html);
  1162. $allMessageBlocks = $messageBusContainer.find(".message_of_user");
  1163. for (var i = 0; i < recentMessages.length; i++) {
  1164. jq($allMessageBlocks[i]).linkify();
  1165. }
  1166. if (userName != sessionStorageManager.getItem("TenantGuid")) {
  1167. emoticonize(null, $conversationBlock);
  1168. }
  1169. }
  1170. function emoticonize($lastMessage, $conversationBlock) {
  1171. if ($lastMessage) {
  1172. jq($lastMessage).emoticonize({ delay: 400 });
  1173. } else {
  1174. var $messages = jq($conversationBlock).find(".emoticon_message");
  1175. $messages.emoticonize({ delay: 400 });
  1176. $messages.removeClass("emoticon_message");
  1177. }
  1178. }
  1179. function showMessageDialogFromMenu(newUserName, dialogsNumber, maxDialogNumber) {
  1180. var userName = undefined,
  1181. $contactRecord;
  1182. if (maxDialogNumber) {
  1183. if (dialogsNumber == maxDialogNumber) {
  1184. userName = sessionStorageManager.getItem("userName" + (dialogsNumber - 1));
  1185. closeConversationBlock(userName);
  1186. }
  1187. closeMessageDialogItem(newUserName);
  1188. openMessageDialog(newUserName);
  1189. if (!sessionStorageManager.getItem("WasConnected")) {
  1190. jq(".conversation_block[data-username='" + newUserName + "']").addClass("display-none");
  1191. }
  1192. if (dialogsNumber == maxDialogNumber) {
  1193. $contactRecord = jq(".contact_block[data-username='" + userName + "']").find(".contact_record");
  1194. if ($contactRecord.length) {
  1195. addToMenu({
  1196. UserName: userName,
  1197. ShowUserName: $contactRecord.text()
  1198. });
  1199. }
  1200. }
  1201. }
  1202. }
  1203. function getMaxDialogNumber() {
  1204. var max = 0 | ((jq(window).width() - LEFT_PANEL_AND_INDENT_WIDTH) / CONVERSATION_BLOCK_WIDTH);
  1205. return max < 0 ? 0 : max;
  1206. }
  1207. function preventDefault(e) {
  1208. e = e || window.event;
  1209. if (e.preventDefault) {
  1210. e.preventDefault();
  1211. }
  1212. e.returnValue = false;
  1213. }
  1214. function enable_scroll() {
  1215. if (window.removeEventListener) {
  1216. window.removeEventListener("DOMMouseScroll", preventDefault, false);
  1217. }
  1218. window.onmousewheel = document.onmousewheel = null;
  1219. }
  1220. function disable_scroll() {
  1221. if (window.addEventListener) {
  1222. window.addEventListener("DOMMouseScroll", preventDefault, false);
  1223. }
  1224. window.onmousewheel = document.onmousewheel = preventDefault;
  1225. }
  1226. function openMessageDialog(userName, reload, index, inMenu) {
  1227. var dialogsNumber = sessionStorageManager.getItem("dialogsNumber") || 0,
  1228. $conversationBlock = undefined,
  1229. closeUserName = undefined;
  1230. if (!sessionStorageManager.getItem("dialogsNumber")) {
  1231. var $allWindows = jq(".small_chat_minimize_all_windows");
  1232. if (!$allWindows.length) {
  1233. $allWindows = jq(".small_chat_restore_all_windows");
  1234. }
  1235. $allWindows.removeClass("disable");
  1236. jq(".small_chat_close_all_windows").removeClass("disable");
  1237. jq("body").on("click", ".small_chat_minimize_all_windows", function () {
  1238. minimizeConversationsBlocks(true);
  1239. })
  1240. .on("click", ".small_chat_restore_all_windows", restoreConversationsBlocks)
  1241. .on("click", ".small_chat_close_all_windows", closeAllWindowsEvent);
  1242. }
  1243. if (!isDialogOpen(userName)) {
  1244. maxDialogNumber = getMaxDialogNumber();
  1245. if (dialogsNumber < maxDialogNumber || reload) {
  1246. var $contactBlock = jq(".contact_block[data-username='" + userName + "']"),
  1247. dn,
  1248. imageStatus;
  1249. // if user was disabled
  1250. if (!$contactBlock.length && dialogsNumber) {
  1251. sessionStorageManager.setItem("dialogsNumber", dialogsNumber - 1);
  1252. sessionStorageManager.removeItem("MiniCB" + userName);
  1253. for (var i = index; i < dialogsNumber - 1; i++) {
  1254. sessionStorageManager.setItem("userName" + i, sessionStorageManager.getItem("userName" + (i + 1)));
  1255. }
  1256. sessionStorageManager.removeItem("userName" + (dialogsNumber - 1));
  1257. disableUser = true;
  1258. return;
  1259. }
  1260. imageStatus = userName != sessionStorageManager.getItem("TenantGuid") ?
  1261. $contactBlock.find(".chat_user_state").attr("class").split(" ")[1] : false;
  1262. var $conversationBlock = jq("#messageDialogTmpl").tmpl({
  1263. UserName: userName,
  1264. HeaderText: $contactBlock.find(".contact_record").text(),
  1265. ImageStatus: imageStatus,
  1266. ImageTitle: getRealStateByImageState(imageStatus)
  1267. }),
  1268. $messageInputArea = $conversationBlock.find(".message_input_area");
  1269. jq($conversationBlock).appendTo(".mainPageContent");
  1270. flashConversationBlock(userName);
  1271. if (!isMobile) {
  1272. $messageInputArea.focus();
  1273. }
  1274. $messageInputArea.autosize({
  1275. className: "message_input_area_autosizejs",
  1276. callback: resizeMessageInputArea
  1277. });
  1278. var $chatMessagesLoading = $conversationBlock.find(".chat_messages_loading");
  1279. $conversationBlock.find(".message_bus_container").scroll(function () {
  1280. if ($conversationBlock.attr("data-internal-id") != "stop" && !$conversationBlock.find(".message_bus_container").scrollTop() &&
  1281. sessionStorageManager.getItem("WasConnected")) {
  1282. $chatMessagesLoading.removeClass("display-none");
  1283. var arg1 = userName == sessionStorageManager.getItem("TenantGuid") ? "" : userName,
  1284. arg2 = $conversationBlock.attr("data-internal-id");
  1285. disable_scroll();
  1286. // getRecentMessages
  1287. chat.server.grm(arg1, arg2).done(function (recentMessages) {
  1288. enable_scroll();
  1289. receiveRecentMessages(userName, recentMessages, $chatMessagesLoading, $conversationBlock, $conversationBlock.attr("data-scroll-height"));
  1290. }).fail(function () {
  1291. enable_scroll();
  1292. });
  1293. }
  1294. });
  1295. if (sessionStorageManager.getItem("WasConnected")) {
  1296. $chatMessagesLoading.removeClass("display-none");
  1297. // getRecentMessages
  1298. chat.server.grm(userName == sessionStorageManager.getItem("TenantGuid") ? "" : userName,
  1299. INT_MAX_VALUE).done(function (recentMessages) {
  1300. receiveRecentMessages(userName, recentMessages, $chatMessagesLoading, $conversationBlock, 0);
  1301. });
  1302. }
  1303. if (reload) {
  1304. jq(".conversation_block[data-username='" + userName + "']").css("right", index * CONVERSATION_BLOCK_WIDTH + 10 + PX);
  1305. $conversationBlock.attr("data-dialog-number", index);
  1306. dn = index;
  1307. } else {
  1308. jq(".conversation_block[data-username='" + userName + "']").css("right", dialogsNumber * CONVERSATION_BLOCK_WIDTH + 10 + PX);
  1309. setParametersOfDialog(userName);
  1310. dn = dialogsNumber;
  1311. }
  1312. if (!initEmoticons) {
  1313. initSmilesPopupMenu();
  1314. initEmoticons = true;
  1315. }
  1316. setSmilesPopupMenu(userName, dn);
  1317. } else if (maxDialogNumber) {
  1318. if (isDialogInMenu(userName)) {
  1319. closeMessageDialogItem(userName);
  1320. }
  1321. closeUserName = sessionStorageManager.getItem("userName" + (dialogsNumber - 1));
  1322. closeConversationBlock(closeUserName);
  1323. openMessageDialog(userName);
  1324. addToMenu({
  1325. UserName: closeUserName,
  1326. ShowUserName: jq(".contact_block[data-username='" + closeUserName + "']").find(".contact_record").text()
  1327. }, inMenu);
  1328. }
  1329. else {
  1330. addToMenu({
  1331. UserName: userName,
  1332. ShowUserName: jq(".contact_block[data-username='" + userName + "']").find(".contact_record").text()
  1333. }, inMenu);
  1334. }
  1335. } else {
  1336. flashConversationBlock(userName);
  1337. }
  1338. }
  1339. function receiveRecentMessages(userName, recentMessages, $chatMessagesLoading, conversationBlock, dataScrollHeight) {
  1340. var $conversationBlock = jq(conversationBlock);
  1341. if (recentMessages) {
  1342. for (var count = 0; count < recentMessages.length; count++) {
  1343. recentMessages[count] = reMap(recentMessages[count], messageContract);
  1344. }
  1345. jq($chatMessagesLoading).addClass("display-none");
  1346. putMessages(recentMessages, userName);
  1347. var $messageBusContainer = $conversationBlock.find(".message_bus_container"),
  1348. scrollHeight = $conversationBlock.find(".message_bus_container").prop("scrollHeight");
  1349. $messageBusContainer.scrollTop(scrollHeight - dataScrollHeight);
  1350. $conversationBlock.attr("data-scroll-height", scrollHeight);
  1351. }
  1352. }
  1353. function resizeMessageInputArea() {
  1354. var $this = jq(this),
  1355. $conversationBlock = $this.closest(".conversation_block"),
  1356. scrollHeight = 0,
  1357. $messageBusContainer = $conversationBlock.find(".message_bus_container"),
  1358. height = parseInt($this.css("height")),
  1359. previousHeight = +$this.attr("data-height"),
  1360. conversationBlockHeight = parseInt($conversationBlock.css("height")) - height + previousHeight;
  1361. // for false trippings in IE
  1362. if (height == previousHeight || conversationBlockHeight > 300) {
  1363. return;
  1364. }
  1365. $conversationBlock.css("height", conversationBlockHeight + PX);
  1366. $conversationBlock.css("padding-bottom", parseInt($conversationBlock.css("padding-bottom")) + height - previousHeight + PX);
  1367. scrollHeight = $messageBusContainer.prop("scrollHeight");
  1368. if ($messageBusContainer.scrollTop() < scrollHeight) {
  1369. $messageBusContainer.scrollTop(scrollHeight);
  1370. }
  1371. scrollHeight = $this.prop("scrollHeight");
  1372. if ($this.scrollTop() < scrollHeight) {
  1373. $this.scrollTop(scrollHeight);
  1374. }
  1375. $this.attr("data-height", height);
  1376. }
  1377. function flashConversationBlock(userName, always) {
  1378. var $headerOfConversationBlock =
  1379. jq(".conversation_block[data-username='" + userName + "']").find(".header_of_conversation_block");
  1380. if ($headerOfConversationBlock.length) {
  1381. if (always) {
  1382. return setInterval(function (conversationBlock) {
  1383. if ($headerOfConversationBlock.hasClass("main-header-color-hover")) {
  1384. $headerOfConversationBlock.addClass("main-header-color");
  1385. $headerOfConversationBlock.removeClass("main-header-color-hover");
  1386. } else {
  1387. $headerOfConversationBlock.addClass("main-header-color-hover");
  1388. $headerOfConversationBlock.removeClass("main-header-color");
  1389. }
  1390. }, 300);
  1391. } else {
  1392. $headerOfConversationBlock.addClass("main-header-color-hover");
  1393. $headerOfConversationBlock.removeClass("main-header-color");
  1394. setTimeout(function (conversationBlock) {
  1395. $headerOfConversationBlock.addClass("main-header-color");
  1396. $headerOfConversationBlock.removeClass("main-header-color-hover");
  1397. }, 100);
  1398. }
  1399. }
  1400. }
  1401. function addToMenu(object, inMenu) {
  1402. if (!jq(".message_dialog_btn").length) {
  1403. html = jq("#messageDialogMenuTmpl").tmpl(object);
  1404. jq(".mainPageContent").append(html);
  1405. if (!sessionStorageManager.getItem("WasConnected")) {
  1406. jq(".message_dialog_btn").addClass("display-none");
  1407. }
  1408. jq.dropdownToggle({
  1409. switcherSelector: ".message_dialog_btn",
  1410. dropdownID: "messageDialogPopupID",
  1411. addTop: -4,
  1412. addLeft: 0,
  1413. alwaysUp: true
  1414. });
  1415. } else {
  1416. html = jq("#messageDialogItemTmpl").tmpl(object);
  1417. jq("#messageDialogPopupID").find(".dropdown-content").append(html);
  1418. var $messageDialogText = jq(".message_dialog_text");
  1419. $messageDialogText.text(+$messageDialogText.text() + 1);
  1420. }
  1421. if (!inMenu) {
  1422. setParametersOfDialogInMenu(object.UserName);
  1423. }
  1424. }
  1425. function setSmilesPopupMenu(userName, dn) {
  1426. jq(".conversation_block[data-username='" + userName + "']").find(".smile_icon").attr("id", "smileIcon" + dn);
  1427. }
  1428. function initSmilesPopupMenu() {
  1429. jq("#smileMenuTmpl").tmpl().appendTo(".mainPageContent");
  1430. jq(".smile").emoticonize();
  1431. }
  1432. function moveSmileMenu(e) {
  1433. var $smileMenu = jq(".smile_menu"),
  1434. dn = jq(e.currentTarget).closest(".conversation_block").attr("data-dialog-number");
  1435. $smileMenu.attr("id", "smilesPopupID" + dn);
  1436. jq.dropdownToggle({
  1437. switcherSelector: "#smileIcon" + dn,
  1438. dropdownID: "smilesPopupID" + dn,
  1439. addLeft: 176,
  1440. addTop: 6,
  1441. rightPos: true,
  1442. alwaysUp: true
  1443. });
  1444. jq("#smilesPopupID" + dn).addClass("smiles_menu_padding");
  1445. }
  1446. function closeAllConversationBlocks() {
  1447. var dialogsNumber = sessionStorageManager.getItem("dialogsNumber");
  1448. if (dialogsNumber) {
  1449. dialogsNumber--;
  1450. for (var i = dialogsNumber; i >= 0; i--) {
  1451. closeConversationBlock(sessionStorageManager.getItem("userName" + i));
  1452. }
  1453. }
  1454. }
  1455. function closeAllMessageDialogItems() {
  1456. var dialogsNumber = sessionStorageManager.getItem("dialogsNumberInMenu");
  1457. if (dialogsNumber) {
  1458. dialogsNumber--;
  1459. for (var i = dialogsNumber; i >= 0; i--) {
  1460. closeMessageDialogItem(sessionStorageManager.getItem("dn_userName" + i));
  1461. }
  1462. }
  1463. }
  1464. function closeConversationBlock(userName) {
  1465. var $conversationBlock = jq(".conversation_block[data-username='" + userName + "']");
  1466. sessionStorageManager.removeItem("userName" + $conversationBlock.attr("data-dialog-number"));
  1467. $conversationBlock.find(".message_input_area").trigger("autosize.destroy");
  1468. $conversationBlock.remove();
  1469. moveOtherConversationBlocks(+$conversationBlock.attr("data-dialog-number"));
  1470. sessionStorageManager.setItem("dialogsNumber", +sessionStorageManager.getItem("dialogsNumber") - 1);
  1471. sessionStorageManager.removeItem("MiniCB" + userName);
  1472. if (!sessionStorageManager.getItem("dialogsNumber")) {
  1473. var $allWindows = jq(".small_chat_minimize_all_windows");
  1474. if (!$allWindows.length) {
  1475. $allWindows = jq(".small_chat_restore_all_windows");
  1476. }
  1477. $allWindows.addClass("disable");
  1478. jq(".small_chat_close_all_windows").addClass("disable");
  1479. jq("body")
  1480. .off("click", ".small_chat_minimize_all_windows")
  1481. .off("click", ".small_chat_restore_all_windows")
  1482. .off("click", ".small_chat_close_all_windows");
  1483. }
  1484. }
  1485. function closeMessageDialogItem(userName) {
  1486. var $messageDialogText = jq(".message_dialog_text");
  1487. removeParametersOfDialogInMenu(userName);
  1488. $messageDialogText.text(+$messageDialogText.text() - 1);
  1489. if (!+$messageDialogText.text()) {
  1490. jq(".message_dialog_btn").remove();
  1491. jq("#messageDialogPopupID").remove();
  1492. }
  1493. }
  1494. function moveOtherConversationBlocks(dialogNumber) {
  1495. var $conversationBlocks = jq(".conversation_block");
  1496. for (var i = 0; i < $conversationBlocks.length; i++) {
  1497. var $conversationBlock = jq($conversationBlocks[i]);
  1498. if ($conversationBlock.attr("data-dialog-number") > dialogNumber) {
  1499. var userName = $conversationBlock.attr("data-username"),
  1500. dn = +$conversationBlock.attr("data-dialog-number") - 1;
  1501. $conversationBlock.css("right", parseInt($conversationBlock.css("right")) - CONVERSATION_BLOCK_WIDTH + PX);
  1502. $conversationBlock.attr("data-dialog-number", dn);
  1503. sessionStorageManager.setItem("userName" + dn, userName);
  1504. $conversationBlock.find(".smile_icon").attr("id", "smileIcon" + dn);
  1505. }
  1506. }
  1507. sessionStorageManager.removeItem("userName" + (sessionStorageManager.getItem("dialogsNumber") - 1));
  1508. }
  1509. function restOrMinConversationBlock(e) {
  1510. var $conversationBlock = jq(e.currentTarget).closest(".conversation_block");
  1511. if ($conversationBlock.find(".smile_icon").hasClass("display-none")) {
  1512. restore($conversationBlock);
  1513. } else {
  1514. minimize($conversationBlock);
  1515. }
  1516. }
  1517. function minimize(conversationBlock) {
  1518. var $conversationBlock = jq(conversationBlock),
  1519. userName = $conversationBlock.attr("data-username"),
  1520. $minimizeRestoreConversationBlock = $conversationBlock.find(".minimize_restore_conversation_block");
  1521. $conversationBlock.find(".smile_icon").addClass("display-none");
  1522. $conversationBlock.find(".message_bus_container").addClass("display-none");
  1523. $conversationBlock.find(".message_input_area").addClass("display-none");
  1524. $minimizeRestoreConversationBlock.addClass("restore_conversation_block");
  1525. $minimizeRestoreConversationBlock.removeClass("minimize_conversation_block");
  1526. $minimizeRestoreConversationBlock.attr("title", ASC.Resources.Master.ChatResource.RestoreMessageWindowAltTitle);
  1527. $conversationBlock.attr({
  1528. "data-height": $conversationBlock.css("height"),
  1529. "data-padding-bottom": $conversationBlock.css("padding-bottom")
  1530. });
  1531. $conversationBlock.css({
  1532. "height": "15px",
  1533. "padding-bottom": "0",
  1534. "bottom": "26px"
  1535. });
  1536. jq(".smile_menu").css("display", "none");
  1537. sessionStorageManager.setItem("MiniCB" + userName, true);
  1538. if (!jq(".minimize_conversation_block").length) {
  1539. var $this = jq(".small_chat_minimize_all_windows");
  1540. if ($this && $this.hasClass("small_chat_minimize_all_windows")) {
  1541. $this.removeClass("small_chat_minimize_all_windows");
  1542. $this.addClass("small_chat_restore_all_windows");
  1543. $this.text(ASC.Resources.Master.ChatResource.RestoreAllWindows);
  1544. $this.closest("#smallChatOptionsPopupID").css("display", "none");
  1545. sessionStorageManager.setItem("minimizeWindows", true);
  1546. }
  1547. }
  1548. }
  1549. function restore(conversationBlock) {
  1550. var $conversationBlock = jq(conversationBlock),
  1551. userName = $conversationBlock.attr("data-username"),
  1552. $messageBusContainer = $conversationBlock.find(".message_bus_container"),
  1553. $minimizeRestoreConversationBlock = $conversationBlock.find(".minimize_restore_conversation_block");
  1554. $messageInputArea = $conversationBlock.find(".message_input_area");
  1555. $conversationBlock.find(".smile_icon").removeClass("display-none");
  1556. $messageBusContainer.removeClass("display-none");
  1557. $messageInputArea.removeClass("display-none");
  1558. $minimizeRestoreConversationBlock.addClass("minimize_conversation_block");
  1559. $minimizeRestoreConversationBlock.removeClass("restore_conversation_block");
  1560. $minimizeRestoreConversationBlock.attr("title", ASC.Resources.Master.ChatResource.MinimizeMessageWindowAltTitle);
  1561. $conversationBlock.css({
  1562. "height": $conversationBlock.attr("data-height"),
  1563. "padding-bottom": $conversationBlock.attr("data-padding-bottom"),
  1564. "bottom": "10px"
  1565. });
  1566. sessionStorageManager.removeItem("MiniCB" + userName);
  1567. scrollTopMessageContainer($messageBusContainer);
  1568. if (jq(".minimize_conversation_block").length) {
  1569. var $this = jq(".small_chat_restore_all_windows");
  1570. if ($this && $this.hasClass("small_chat_restore_all_windows")) {
  1571. $this.removeClass("small_chat_restore_all_windows");
  1572. $this.addClass("small_chat_minimize_all_windows");
  1573. $this.text(ASC.Resources.Master.ChatResource.MinimizeAllWindows);
  1574. $this.closest("#smallChatOptionsPopupID").css("display", "none");
  1575. sessionStorageManager.removeItem("minimizeWindows");
  1576. }
  1577. }
  1578. $messageInputArea.focus();
  1579. }
  1580. function restoreConversationsBlocks() {
  1581. var $blocks = jq(".conversation_block"),
  1582. $this = jq(".small_chat_restore_all_windows");
  1583. if ($blocks.length) {
  1584. for (var i = 0; i < $blocks.length; i++) {
  1585. if (jq($blocks[i]).find(".smile_icon").hasClass("display-none")) {
  1586. restore($blocks[i]);
  1587. }
  1588. }
  1589. }
  1590. if ($this && $this.hasClass("small_chat_restore_all_windows")) {
  1591. $this.removeClass("small_chat_restore_all_windows");
  1592. $this.addClass("small_chat_minimize_all_windows");
  1593. $this.text(ASC.Resources.Master.ChatResource.MinimizeAllWindows);
  1594. $this.closest("#smallChatOptionsPopupID").css("display", "none");
  1595. sessionStorageManager.removeItem("minimizeWindows");
  1596. }
  1597. }
  1598. function minimizeConversationsBlocks(neededCloseMenu) {
  1599. var $blocks = jq(".conversation_block"),
  1600. $this = jq(".small_chat_minimize_all_windows");
  1601. if ($blocks.length) {
  1602. for (var i = 0; i < $blocks.length; i++) {
  1603. if (!jq($blocks[i]).find(".smile_icon").hasClass("display-none")) {
  1604. minimize($blocks[i]);
  1605. }
  1606. }
  1607. }
  1608. if ($this && $this.hasClass("small_chat_minimize_all_windows")) {
  1609. $this.removeClass("small_chat_minimize_all_windows");
  1610. $this.addClass("small_chat_restore_all_windows");
  1611. $this.text(ASC.Resources.Master.ChatResource.RestoreAllWindows);
  1612. if (neededCloseMenu) {
  1613. $this.closest("#smallChatOptionsPopupID").css("display", "none");
  1614. }
  1615. sessionStorageManager.setItem("minimizeWindows", true);
  1616. }
  1617. }
  1618. function sendMessage(e) {
  1619. var k = e.keyCode,
  1620. ctrlKey = e.ctrlKey;
  1621. // Verify that the key entered is not a special key
  1622. if (k == 20 /* Caps lock */
  1623. || k == 16 /* Shift */
  1624. || k == 17 /* Control Key */
  1625. || k == 91 /* Windows Command Key */
  1626. || k == 19 /* Pause Break */
  1627. || k == 18 /* Alt Key */
  1628. || k == 93 /* Right Click Point Key */
  1629. || (k >= 35 && k <= 40) /* Home, End, Arrow Keys */
  1630. || k == 45 /* Insert Key */
  1631. || (k >= 33 && k <= 34) /*Page Down, Page Up */
  1632. || (k >= 112 && k <= 123) /* F1 - F12 */
  1633. || (k >= 144 && k <= 145)) { /* Num Lock, Scroll Lock */
  1634. return true;
  1635. }
  1636. var inputAreaHeight = 0,
  1637. $messageInputArea = jq(e.currentTarget),
  1638. $conversationBlock = $messageInputArea.closest(".conversation_block"),
  1639. userName = $conversationBlock.attr("data-username"),
  1640. text = $messageInputArea.val(),
  1641. isTenant = false,
  1642. enableCtrlEnter = localStorageManager.getItem("EnableCtrlEnter"),
  1643. newUserName;
  1644. if (k == 27) { /* Escape Key */
  1645. closeConversationBlock(userName);
  1646. var dialogsNumberInMenu = sessionStorageManager.getItem("dialogsNumberInMenu");
  1647. if (dialogsNumberInMenu) {
  1648. newUserName = sessionStorageManager.getItem("dn_userName" + (dialogsNumberInMenu - 1));
  1649. closeMessageDialogItem(newUserName);
  1650. openMessageDialog(newUserName);
  1651. } else {
  1652. newUserName = sessionStorageManager.getItem("userName" + (sessionStorageManager.getItem("dialogsNumber") - 1));
  1653. jq(".conversation_block[data-username='" + newUserName + "']").find(".message_input_area").focus();
  1654. }
  1655. return true;
  1656. } else if (k == 9) { /* Tab */
  1657. var dn = sessionStorageManager.getItem("dialogsNumber");
  1658. if (dn > 1) {
  1659. for (var i = 0; i < dn; i++) {
  1660. if (sessionStorageManager.getItem("userName" + i) == userName) {
  1661. newUserName = i == 0 ? sessionStorageManager.getItem("userName" + (dn - 1)) : sessionStorageManager.getItem("userName" + (i - 1));
  1662. // setTimeout - workaround for bug with focus() in Chrome
  1663. setTimeout(function () {
  1664. var $conversationBlock = jq(".conversation_block[data-username='" + newUserName + "']")
  1665. if ($conversationBlock.find(".smile_icon").hasClass("display-none")) {
  1666. restore($conversationBlock);
  1667. }
  1668. $conversationBlock.find(".message_input_area").focus();
  1669. }, 1);
  1670. break;
  1671. }
  1672. }
  1673. }
  1674. return false;
  1675. }
  1676. var timerId = flashBlocks[userName];
  1677. if (timerId) {
  1678. $conversationBlock.find(".not_read_message").removeClass("not_read_message");
  1679. var $headerOfConversationBlock = $conversationBlock.find(".header_of_conversation_block");
  1680. clearInterval(timerId);
  1681. if ($headerOfConversationBlock.length) {
  1682. if ($headerOfConversationBlock.hasClass("main-header-color-hover")) {
  1683. $headerOfConversationBlock.addClass("main-header-color");
  1684. $headerOfConversationBlock.removeClass("main-header-color-hover");
  1685. }
  1686. }
  1687. }
  1688. delete flashBlocks[userName];
  1689. if (sessionStorageManager.getItem("WasConnected")) {
  1690. sendTypingSignal(userName);
  1691. $messageBusContainer = $conversationBlock.find(".message_bus_container");
  1692. hideTypingMessageNotification($conversationBlock, $messageBusContainer);
  1693. if (userName == sessionStorageManager.getItem("TenantGuid")) {
  1694. isTenant = true;
  1695. }
  1696. if (k == ENTER_KEY_CODE && ctrlKey && !enableCtrlEnter) {
  1697. var cursorPos = $messageInputArea.prop("selectionStart"),
  1698. v = $messageInputArea.val();
  1699. $messageInputArea.val(v.substring(0, cursorPos) + "\n" + v.substring(cursorPos, v.length));
  1700. $messageInputArea.val($messageInputArea.val() + " ");
  1701. setCaretPosition($messageInputArea, cursorPos + 1);
  1702. $messageInputArea.trigger("autosize.resize");
  1703. $messageInputArea.scrollTop($messageInputArea.prop("scrollHeight"));
  1704. } else if (k == ENTER_KEY_CODE && ((!enableCtrlEnter && !ctrlKey) || (enableCtrlEnter && ctrlKey))) {
  1705. if ((/^\s*$/.test(text))) {
  1706. return true;
  1707. }
  1708. //Send
  1709. chat.server.s(isTenant ? "" : userName, text);
  1710. putMessage({
  1711. IsMessageOfCurrentUser: true,
  1712. Name: currentAccount.ShowUserName,
  1713. DateTime: Teamlab.getDisplayTime(new Date()),
  1714. Message: addBr(text)
  1715. }, userName);
  1716. $conversationBlock.css({ "height": "300px", "padding-bottom": "61px" });
  1717. $messageInputArea.css("height", "29px");
  1718. $messageInputArea.attr("data-height", "29");
  1719. $messageInputArea.val("");
  1720. return false;
  1721. }
  1722. }
  1723. }
  1724. function setCaretPosition(elem, caretPos) {
  1725. var el = jq(elem)[0];
  1726. el.value = el.value;
  1727. // ^ this is used to not only get "focus", but
  1728. // to make sure we don't have it everything -selected-
  1729. // (it causes an issue in chrome, and having it doesn't hurt any other browser)
  1730. if (el !== null) {
  1731. if (el.createTextRange) {
  1732. var range = el.createTextRange();
  1733. range.move('character', caretPos);
  1734. range.select();
  1735. return true;
  1736. }
  1737. else {
  1738. // (el.selectionStart === 0 added for Firefox bug)
  1739. if (el.selectionStart || el.selectionStart === 0) {
  1740. el.focus();
  1741. el.setSelectionRange(caretPos, caretPos);
  1742. return true;
  1743. }
  1744. else { // fail city, fortunately this never happens (as far as I've tested) :)
  1745. el.focus();
  1746. return false;
  1747. }
  1748. }
  1749. }
  1750. }
  1751. function addBr(str) {
  1752. if (str) {
  1753. var lines = str.trim().split(/\r\n|\n\r|\r|\n/);
  1754. for (var i = 0; i < lines.length; i++) {
  1755. lines[i] = Encoder.htmlEncode(lines[i]);
  1756. }
  1757. return lines.join("<br />");
  1758. } else {
  1759. return "";
  1760. }
  1761. }
  1762. function sendTypingSignal(userName) {
  1763. if (userName != sessionStorageManager.getItem("TenantGuid") && sendTypingSignalTimeout == null) {
  1764. sendTypingSignalTimeout = setTimeout(function () {
  1765. sendTypingSignalTimeout = null;
  1766. }, 3000);
  1767. //sendTyping
  1768. chat.server.st(userName);
  1769. }
  1770. }
  1771. function chooseStatus(e) {
  1772. chooseUserStatus(jq(e.currentTarget).attr("class").split(" ")[2]);
  1773. }
  1774. function chooseUserStatus(state) {
  1775. var prevStatus = currentStatus,
  1776. $showSmallChatIcon = jq(".show_small_chat_icon"),
  1777. $smallChatPopupID = jq("#smallChatPopupID"),
  1778. $smallChatTextStatus = jq(".small_chat_text_status"),
  1779. $currentStatus = jq("." + currentStatus),
  1780. realState;
  1781. $smallChatPopupID.removeClass("display_block");
  1782. $smallChatPopupID.addClass("display-none");
  1783. $currentStatus.removeClass("disable");
  1784. $smallChatTextStatus.removeClass(currentImage);
  1785. $currentStatus.click(chooseStatus);
  1786. currentStatus = state;
  1787. sessionStorageManager.setItem("CurrentStatus", currentStatus);
  1788. switch (state) {
  1789. case ONLINE:
  1790. currentImage = IMAGE_ONLINE;
  1791. initConnect();
  1792. break;
  1793. case AWAY:
  1794. currentImage = IMAGE_AWAY;
  1795. initConnect();
  1796. break;
  1797. case NOT_AVAILABLE:
  1798. currentImage = IMAGE_NOT_AVAILABLE;
  1799. initConnect();
  1800. break;
  1801. default:
  1802. currentImage = IMAGE_OFFLINE;
  1803. if (sessionStorageManager.getItem("WasConnected")) {
  1804. connectionStop();
  1805. }
  1806. }
  1807. $currentStatus = jq("." + currentStatus);
  1808. $currentStatus.off("click");
  1809. $currentStatus.addClass("disable");
  1810. $smallChatTextStatus.addClass(currentImage);
  1811. realState = getRealState(currentStatus);
  1812. $smallChatTextStatus.text(realState);
  1813. jq(".small_chat_status_menu").attr("title", realState);
  1814. if (state == OFFLINE) {
  1815. $showSmallChatIcon.addClass("small_chat_icon_white");
  1816. $showSmallChatIcon.removeClass("small_chat_icon_green");
  1817. } else {
  1818. $showSmallChatIcon.addClass("small_chat_icon_green");
  1819. $showSmallChatIcon.removeClass("small_chat_icon_white");
  1820. }
  1821. if (state != OFFLINE && sessionStorageManager.getItem("WasConnected")) {
  1822. // sendStateToTenant
  1823. chat.server.sstt(getUserNumberByState(currentStatus));
  1824. }
  1825. }
  1826. function searchContactByEnter(e) {
  1827. if (e.keyCode == ENTER_KEY_CODE) {
  1828. clearTimeout(jq(e.currentTarget).data("timeoutId"));
  1829. searchContact();
  1830. } else {
  1831. var timeoutId = setTimeout(function () {
  1832. clearTimeout(jq(e.currentTarget).data("timeoutId"));
  1833. searchContact();
  1834. }, SEARCH_CONTACT_INTERVAL);
  1835. }
  1836. }
  1837. function clearSearchText() {
  1838. var $searchIcon = jq(".search_icon");
  1839. jq(".small_chat_search_field").val("");
  1840. searchContact();
  1841. }
  1842. function searchContact() {
  1843. var template = jq(".small_chat_search_field").val().toLowerCase().trim(),
  1844. $contactRecords = jq(".contact_record"),
  1845. $contactBlocks = jq(".contact_block"),
  1846. $searchIcon = jq(".search_icon"),
  1847. $contactBlock,
  1848. $contactRecord;
  1849. for (var i = 0; i < $contactRecords.length; i++) {
  1850. $contactRecord = jq($contactRecords[i]);
  1851. $contactBlock = $contactRecord.parent();
  1852. if ($contactRecord.text().toLowerCase().indexOf(template) == -1) {
  1853. $contactBlock.removeClass("display_block");
  1854. $contactBlock.addClass("display-none");
  1855. } else {
  1856. $contactBlock.addClass("display_block");
  1857. $contactBlock.removeClass("display-none");
  1858. }
  1859. }
  1860. if (!jq(".contact_block.display_block").length) {
  1861. jq(".small_chat_contact_not_found_record").removeClass("display-none");
  1862. } else {
  1863. jq(".small_chat_contact_not_found_record").addClass("display-none");
  1864. }
  1865. if (template != "") {
  1866. $searchIcon.removeClass("search_icon_image");
  1867. $searchIcon.addClass("clear_text_image");
  1868. $searchIcon.attr("title", ASC.Resources.Master.ChatResource.ClearText);
  1869. } else {
  1870. $searchIcon.removeClass("clear_text_image");
  1871. $searchIcon.addClass("search_icon_image");
  1872. $searchIcon.attr("title", ASC.Resources.Master.ChatResource.Search);
  1873. }
  1874. }
  1875. function playSound(filename) {
  1876. var $soundContainer = jq("#soundContainer");
  1877. if (!$soundContainer.length) {
  1878. $soundContainer = jq("<div>").attr("id", "soundContainer").appendTo(jq("body"));
  1879. }
  1880. $soundContainer.html('<audio autoplay="autoplay"><source src="' + filename + '.mp3" type="audio/mpeg" /><source src="'
  1881. + filename + '.ogg" type="audio/ogg" /><source src="' + filename +
  1882. '.wav" type="audio/wav" /><embed hidden="true" autostart="true" loop="false" src="' + filename + '.mp3" /></audio>');
  1883. }
  1884. function setChatHeight() {
  1885. sessionStorageManager.setItem("SmallChatHeight", jq(".small_chat_main_window").css("height"));
  1886. }
  1887. function resizeChat() {
  1888. if (isMobile) {
  1889. return;
  1890. }
  1891. var $chat = jq(".small_chat_main_window");
  1892. $chat.resizable({
  1893. handles: "n",
  1894. minHeight: 0,
  1895. maxHeight: jq(window).height() - jq(".mainPageLayout").outerHeight(true) - HEIGHT_OFFSET,
  1896. start: function (e, ui) {
  1897. $chat.off("mouseenter", ".contact_block", openUserDetailList);
  1898. $chat.resizable({
  1899. maxHeight: jq(window).height() - jq(".mainPageLayout").outerHeight(true) - HEIGHT_OFFSET
  1900. });
  1901. },
  1902. stop: function (e, ui) {
  1903. $chat.on("mouseenter", ".contact_block", openUserDetailList);
  1904. $chat.resizable({
  1905. maxHeight: jq(window).height() - jq(".mainPageLayout").outerHeight(true) - HEIGHT_OFFSET
  1906. });
  1907. setChatHeight();
  1908. }
  1909. }).bind("resize", function () {
  1910. jq(this).css("top", "auto");
  1911. });
  1912. $chat.resizable("enable");
  1913. }
  1914. function initConnect() {
  1915. if (!sessionStorageManager.getItem("WasConnected")) {
  1916. connectionStart();
  1917. }
  1918. }
  1919. function connectionStart() {
  1920. if (jq.connection.hub.state !== jq.connection.connectionState.connected || already) {
  1921. return;
  1922. }
  1923. already = true;
  1924. var $smallChatMainWindow = jq(".small_chat_main_window");
  1925. chat.server.cu().done(function () {
  1926. $smallChatMainWindow.off("click", ".show_small_chat_icon");
  1927. $smallChatMainWindow.on("click", ".show_small_chat_icon", showOrHideSmallChat);
  1928. if (connectionStartTimer) {
  1929. clearTimeout(connectionStartTimer);
  1930. connectionStartTimer = null;
  1931. }
  1932. if (!currentAccount) {
  1933. // getInitData
  1934. chat.server.gid().done(function () {
  1935. already = false;
  1936. }).fail(function () {
  1937. already = false;
  1938. });
  1939. } else {
  1940. // getStates
  1941. chat.server.gs().done(function () {
  1942. already = false;
  1943. }).fail(function () {
  1944. already = false;
  1945. });
  1946. }
  1947. //already = false;
  1948. }).fail(function () {
  1949. $smallChatMainWindow.off("click", ".show_small_chat_icon");
  1950. $smallChatMainWindow.on("click", ".show_small_chat_icon", showOrHideSmallChat);
  1951. showErrorNotification();
  1952. closeChat();
  1953. already = false;
  1954. });
  1955. }
  1956. function showErrorNotification() {
  1957. var $noties = jq("body").find(".noty_text"),
  1958. alreadyShow = false,
  1959. error = jq(".small_chat_main_window").attr("data-error");
  1960. if ($noties.length) {
  1961. for (var i = 0; i < $noties.length; i++) {
  1962. if (jq($noties[i]).text() == error) {
  1963. alreadyShow = true;
  1964. }
  1965. }
  1966. }
  1967. if (!alreadyShow) {
  1968. noty({
  1969. text: error,
  1970. layout: "bottomRight",
  1971. theme: "defaultTheme",
  1972. type: "alert",
  1973. animation: {
  1974. easing: "swing",
  1975. open: { "height": "toggle" },
  1976. close: { "height": "toggle" },
  1977. speed: "400",
  1978. },
  1979. timeout: 100000,
  1980. maxVisible: 7,
  1981. force: true
  1982. });
  1983. }
  1984. ASC.Controls.JabberClient.extendChat = function () { ASC.Controls.JabberClient.open(); }
  1985. }
  1986. function connectionStop() {
  1987. var $smallChatMainWindow = jq(".small_chat_main_window");
  1988. if (jq.connection.hub.state !== jq.connection.connectionState.connected || already) {
  1989. return;
  1990. }
  1991. already = true;
  1992. sessionStorageManager.setItem("WasConnected", false);
  1993. chat.server.dcu().done(function () {
  1994. already = false;
  1995. }).fail(function () {
  1996. already = false;
  1997. });
  1998. if (pingTimerId) {
  1999. clearInterval(pingTimerId);
  2000. pingTimerId = null;
  2001. }
  2002. var $chatUserState = jq(".chat_user_state"),
  2003. $conversationBlockUserState = jq(".conversation_block_user_state");
  2004. $chatUserState.addClass(IMAGE_OFFLINE);
  2005. $conversationBlockUserState.addClass(IMAGE_OFFLINE);
  2006. $chatUserState.removeClass(IMAGE_ONLINE);
  2007. $conversationBlockUserState.removeClass(IMAGE_ONLINE);
  2008. $chatUserState.removeClass(IMAGE_AWAY);
  2009. $conversationBlockUserState.removeClass(IMAGE_AWAY);
  2010. $chatUserState.removeClass(IMAGE_NOT_AVAILABLE);
  2011. $conversationBlockUserState.removeClass(IMAGE_NOT_AVAILABLE);
  2012. var $onlineLists = jq(".online_user_list").children(),
  2013. $awayLists = jq(".away_user_list").children(),
  2014. $notAvailableLists = jq(".not_available_user_list").children(),
  2015. $onlineContact,
  2016. $awayContact,
  2017. $notAvailableContact;
  2018. for (var i = 0; i < $onlineLists.length; i++) {
  2019. $onlineContact = jq($onlineLists[i]);
  2020. $onlineContact.detach();
  2021. var contactNumber = getContactNumberBeforeCurrent($onlineContact.find(".contact_record").text().toLowerCase(), "offline_user_list");
  2022. if (contactNumber) {
  2023. $onlineContact.insertAfter(".offline_user_list li:nth-child(" + contactNumber + ")");
  2024. } else {
  2025. $onlineContact.prependTo(".offline_user_list");
  2026. }
  2027. }
  2028. for (var i = 0; i < $awayLists.length; i++) {
  2029. $awayContact = jq($awayLists[i]);
  2030. $awayContact.detach();
  2031. var contactNumber = getContactNumberBeforeCurrent($awayContact.find(".contact_record").text().toLowerCase(), "offline_user_list");
  2032. if (contactNumber) {
  2033. $awayContact.insertAfter(".offline_user_list li:nth-child(" + contactNumber + ")");
  2034. } else {
  2035. $awayContact.prependTo(".offline_user_list");
  2036. }
  2037. }
  2038. for (var i = 0; i < $notAvailableLists.length; i++) {
  2039. $notAvailableContact = jq($notAvailableLists[i]);
  2040. $notAvailableContact.detach();
  2041. var contactNumber = getContactNumberBeforeCurrent($notAvailableContact.find(".contact_record").text().toLowerCase(), "offline_user_list");
  2042. if (contactNumber) {
  2043. $notAvailableContact.insertAfter(".offline_user_list li:nth-child(" + contactNumber + ")");
  2044. } else {
  2045. $notAvailableContact.prependTo(".offline_user_list");
  2046. }
  2047. }
  2048. }
  2049. function showOrHideStatusMenu() {
  2050. var $smallChatPopupID = jq("#smallChatPopupID");
  2051. if (!$smallChatPopupID.hasClass("display_block")) {
  2052. $smallChatPopupID.removeClass("display-none");
  2053. $smallChatPopupID.addClass("display_block");
  2054. } else {
  2055. $smallChatPopupID.removeClass("display_block");
  2056. $smallChatPopupID.addClass("display-none");
  2057. }
  2058. }
  2059. function closeNoty(e) {
  2060. if (jq(e.target).attr("class") != "notification_close") {
  2061. var userName = jq(e.currentTarget).find(".notification_username").attr("data-username"),
  2062. $notifications = jq(".notification_username[data-username='" + userName + "']");
  2063. if ($notifications.length) {
  2064. $notifications = jq(".notification_username[data-username='" + userName + "']");
  2065. for (var i = 0; i < $notifications.length; i++) {
  2066. jq($notifications[i]).closest("li").remove();
  2067. }
  2068. openMessageDialog(userName);
  2069. }
  2070. } else {
  2071. jq(e.currentTarget).closest("li").remove();
  2072. }
  2073. }
  2074. function activeWindow() {
  2075. var $doc = jq(document);
  2076. if (!isActive) {
  2077. isActive = true;
  2078. if (titleTimerId) {
  2079. clearInterval(titleTimerId);
  2080. titleTimerId = null;
  2081. starsNumber = 1;
  2082. for (var i = 0 ; i < shouldOpenUserDialogs.length; i++) {
  2083. openMessageDialog(shouldOpenUserDialogs[i]);
  2084. }
  2085. shouldOpenUserDialogs = [];
  2086. setTimeout(function () {
  2087. $doc.find("title").text(originalTitle);
  2088. }, TITLE_INTERVAL);
  2089. }
  2090. }
  2091. }
  2092. function reMap(smallObject, contract) {
  2093. var largeObject = {};
  2094. for (var smallProperty in contract) {
  2095. largeObject[contract[smallProperty]] = smallObject[smallProperty];
  2096. }
  2097. return largeObject;
  2098. }
  2099. function handleMenuClickEvent(currentAccount, item) {
  2100. var $this = jq(currentAccount),
  2101. $smallChatCheckbox = $this.find(".small_chat_checkbox");
  2102. if ($smallChatCheckbox.hasClass("small_chat_checkbox_enabled")) {
  2103. $smallChatCheckbox.removeClass("small_chat_checkbox_enabled");
  2104. $smallChatCheckbox.addClass("small_chat_checkbox_disabled");
  2105. localStorageManager.setItem(item, false);
  2106. } else {
  2107. $smallChatCheckbox.addClass("small_chat_checkbox_enabled");
  2108. $smallChatCheckbox.removeClass("small_chat_checkbox_disabled");
  2109. localStorageManager.setItem(item, true);
  2110. }
  2111. $this.closest("#smallChatOptionsPopupID").css("display", "none");
  2112. }
  2113. function minimizeAllWindowsIfLoseFocus(event, target) {
  2114. if (localStorageManager.getItem("EnableMinimizeAllWindowsIfLoseFocus")) {
  2115. if (target && jq(target).closest(".conversation_block, .small_chat_main_window").length) {
  2116. return;
  2117. }
  2118. setTimeout(function () {
  2119. if (!target && jq(".message_input_area:focus, .conversation_block:hover, .smile_menu:hover, .small_chat_main_window:hover").length) {
  2120. return;
  2121. }
  2122. minimizeConversationsBlocks();
  2123. }, 100);
  2124. }
  2125. }
  2126. function closeAllWindowsEvent(e) {
  2127. closeAllConversationBlocks();
  2128. closeAllMessageDialogItems();
  2129. jq(this).closest("#smallChatOptionsPopupID").css("display", "none");
  2130. return false;
  2131. };
  2132. function init() {
  2133. var $chat = jq(".small_chat_main_window"),
  2134. $mainPageContent = jq(".mainPageContent"),
  2135. $body = jq("body"),
  2136. $window = jq(window);
  2137. sessionStorageManager.setItem("WasLoad", false);
  2138. if (!sessionStorageManager.getItem("dialogsNumber")) {
  2139. sessionStorageManager.setItem("dialogsNumber", 0);
  2140. }
  2141. if (sessionStorageManager.getItem("WasConnected")) {
  2142. jq.connection.hub.stateChanged(function () {
  2143. if (jq.connection.hub.state === jq.connection.connectionState.connected) {
  2144. connectionStart();
  2145. showChat();
  2146. }
  2147. });
  2148. }
  2149. $window.bind("beforeunload", function () {
  2150. reloadPage = true;
  2151. });
  2152. $body.on("mousedown", ".noty_bar", closeNoty);
  2153. $chat.off("click", ".show_small_chat_icon").
  2154. on("click", ".show_small_chat_icon", showOrHideSmallChat).
  2155. on("click", ".contact_block", function (e) {
  2156. var userName = jq(e.currentTarget).attr("data-username");
  2157. if (!isDialogOpen(userName)) {
  2158. openMessageDialog(userName);
  2159. } else {
  2160. var $conversationBlock = jq(".conversation_block[data-username='" + userName + "']");
  2161. if ($conversationBlock.find(".smile_icon").hasClass("display-none")) {
  2162. restore($conversationBlock);
  2163. }
  2164. }
  2165. }).
  2166. on("mouseenter", ".contact_block", openUserDetailList).
  2167. on("mouseleave", ".contact_block", closeUserDetailList).
  2168. on("mouseup", ".small_chat_status_menu", showOrHideStatusMenu).
  2169. on("click", ".search_icon_image", searchContact).
  2170. on("click", ".clear_text_image", clearSearchText).
  2171. on("keydown", ".small_chat_search_field", searchContactByEnter);
  2172. jq(".extend_chat_icon").on("click", extendChat);
  2173. jq(".mainPageTableSidePanel").on("mouseenter", ".detail_user_list", function () {
  2174. var $detailUserList = jq(this);
  2175. $detailUserList.addClass("hover");
  2176. $detailUserList.find(".link").addClass("text_underline");
  2177. }).
  2178. on("mouseleave", ".detail_user_list", function () {
  2179. var $detailUserList = jq(this);
  2180. $detailUserList.removeClass("hover");
  2181. $detailUserList.find(".link").removeClass("text_underline");
  2182. closeUserDetailList();
  2183. });
  2184. $mainPageContent.on("keydown", ".message_input_area", sendMessage).
  2185. on("blur", ".message_input_area", minimizeAllWindowsIfLoseFocus).
  2186. on("mouseover", ".conversation_block", function (e) {
  2187. var $this = jq(e.currentTarget),
  2188. userName = $this.attr("data-username");
  2189. $this.find(".not_read_message").removeClass("not_read_message");
  2190. var timerId = flashBlocks[userName];
  2191. if (timerId) {
  2192. clearInterval(timerId);
  2193. var $headerOfConversationBlock = $this.find(".header_of_conversation_block");
  2194. if ($headerOfConversationBlock.length && $headerOfConversationBlock.hasClass("main-header-color-hover")) {
  2195. $headerOfConversationBlock.addClass("main-header-color");
  2196. $headerOfConversationBlock.removeClass("main-header-color-hover");
  2197. }
  2198. }
  2199. delete flashBlocks[userName];
  2200. }).
  2201. on("click", ".close_conversation_block", function (e) {
  2202. closeConversationBlock(jq(e.currentTarget).closest(".conversation_block").attr("data-username"));
  2203. if (jq(".message_dialog_btn").length) {
  2204. var userName = jq("#messageDialogPopupID").find(".message_dialog_item").first().attr("data-username");
  2205. closeMessageDialogItem(userName);
  2206. openMessageDialog(userName);
  2207. }
  2208. }).
  2209. on("click", ".minimize_restore_conversation_block", function (e) {
  2210. restOrMinConversationBlock(e);
  2211. }).
  2212. on("click", ".extend_conversation_block", extendChat).
  2213. on("dblclick", ".header_of_conversation_block", restOrMinConversationBlock).
  2214. on("click", ".smile", putSmileInMessage).
  2215. on("click", ".message_dialog_close_item_icon", function (e) {
  2216. closeMessageDialogItem(jq(e.currentTarget).closest(".message_dialog_item").attr("data-username"));
  2217. jq("#messageDialogPopupID").css("top", parseInt(jq("#messageDialogPopupID").css("top")) + MESSAGE_WINDOW_ITEM_HEIGHT + PX);
  2218. return false;
  2219. }).
  2220. on("click", ".message_dialog_item_text", function (e) {
  2221. showMessageDialogFromMenu(jq(e.currentTarget).parent().attr("data-username"),
  2222. sessionStorageManager.getItem("dialogsNumber"), getMaxDialogNumber());
  2223. }).
  2224. on("click", ".smile_icon", moveSmileMenu);
  2225. jq("." + AWAY).click(chooseStatus);
  2226. jq("." + NOT_AVAILABLE).click(chooseStatus);
  2227. jq("." + OFFLINE).click(chooseStatus);
  2228. jq(document).click(function (e) {
  2229. var $block = jq(e.target),
  2230. $smallChatPopupID = jq("#smallChatPopupID");
  2231. if ($smallChatPopupID.hasClass("display_block") && !$block.hasClass("small_chat_status_menu") &&
  2232. !$block.hasClass("small_chat_image_status") && !$block.hasClass("small_chat_text_status")) {
  2233. $smallChatPopupID.removeClass("display_block");
  2234. $smallChatPopupID.addClass("display-none");
  2235. }
  2236. });
  2237. if (sessionStorageManager.getItem("dialogsNumber")) {
  2238. var $allWindows = jq(".small_chat_minimize_all_windows");
  2239. if (!$allWindows.length) {
  2240. $allWindows = jq(".small_chat_restore_all_windows");
  2241. }
  2242. $allWindows.removeClass("disable");
  2243. $body.on("click", ".small_chat_minimize_all_windows", function () {
  2244. minimizeConversationsBlocks(true);
  2245. }).on("click", ".small_chat_restore_all_windows", function () {
  2246. restoreConversationsBlocks();
  2247. });
  2248. }
  2249. if (sessionStorageManager.getItem("minimizeWindows")) {
  2250. var $smallChatMinimizeAllWindows = jq(".small_chat_minimize_all_windows");
  2251. $smallChatMinimizeAllWindows.addClass("small_chat_restore_all_windows");
  2252. $smallChatMinimizeAllWindows.removeClass("small_chat_minimize_all_windows");
  2253. $smallChatMinimizeAllWindows.text(ASC.Resources.Master.ChatResource.RestoreAllWindows);
  2254. }
  2255. if (sessionStorageManager.getItem("dialogsNumber")) {
  2256. $body.on("click", ".small_chat_close_all_windows", closeAllWindowsEvent);
  2257. jq(".small_chat_close_all_windows").removeClass("disable");
  2258. }
  2259. $window.focus(function () {
  2260. activeWindow();
  2261. }).blur(function () {
  2262. if (isActive) {
  2263. isActive = false;
  2264. }
  2265. }).mouseenter(function () {
  2266. activeWindow();
  2267. }).mouseleave(function () {
  2268. if (isActive) {
  2269. isActive = false;
  2270. }
  2271. }).resize(function () {
  2272. if (sessionStorageManager.getItem("WasConnected")) {
  2273. if ($window.outerHeight(true) - 58 >= CONVERSATION_BLOCK_HEIGHT && oldWindowHeight - 58 < CONVERSATION_BLOCK_HEIGHT) {
  2274. restoreConversationsBlocks();
  2275. } else if ($window.outerHeight(true) - 58 < CONVERSATION_BLOCK_HEIGHT && oldWindowHeight - 58 >= CONVERSATION_BLOCK_HEIGHT) {
  2276. minimizeConversationsBlocks();
  2277. }
  2278. if ($window.outerHeight(true) - oldWindowHeight) {
  2279. oldWindowHeight = $window.outerHeight(true);
  2280. var maxHeightOfChat = oldWindowHeight - jq(".mainPageLayout").outerHeight(true) - HEIGHT_OFFSET;
  2281. $chat.resizable({
  2282. handles: "n",
  2283. minHeight: 0,
  2284. maxHeight: maxHeightOfChat
  2285. });
  2286. if ($chat.outerHeight(true) > maxHeightOfChat) {
  2287. jq(".small_chat_main_window").css("height", maxHeightOfChat + PX);
  2288. setChatHeight();
  2289. }
  2290. }
  2291. }
  2292. if ($window.width() != oldWindowWidth) {
  2293. oldWindowWidth = $window.width();
  2294. maxDialogNumber = getMaxDialogNumber();
  2295. var dialogsNumber = sessionStorageManager.getItem("dialogsNumber"),
  2296. diff = dialogsNumber - maxDialogNumber,
  2297. userName;
  2298. if (!diff) {
  2299. return;
  2300. }
  2301. if (diff > 0) {
  2302. for (var i = 0; i < diff; i++) {
  2303. userName = sessionStorageManager.getItem("userName" + (dialogsNumber - 1));
  2304. if (userName) {
  2305. closeConversationBlock(userName);
  2306. addToMenu({
  2307. UserName: userName,
  2308. ShowUserName: jq(".contact_block[data-username='" + userName + "']").find(".contact_record").text(),
  2309. });
  2310. dialogsNumber = sessionStorageManager.getItem("dialogsNumber");
  2311. }
  2312. }
  2313. } else {
  2314. var dialogsNumberInMenu;
  2315. diff = -diff;
  2316. for (var i = 0; i < diff; i++) {
  2317. dialogsNumberInMenu = sessionStorageManager.getItem("dialogsNumberInMenu");
  2318. if (dialogsNumberInMenu) {
  2319. userName = sessionStorageManager.getItem("dn_userName" + (dialogsNumberInMenu - 1));
  2320. if (userName) {
  2321. showMessageDialogFromMenu(userName, dialogsNumber, maxDialogNumber);
  2322. }
  2323. }
  2324. }
  2325. }
  2326. }
  2327. });
  2328. if (!isMobile) {
  2329. $mainPageContent.on("click", ".message_bus_container", function (e) {
  2330. if (window.getSelection().toString() == "") {
  2331. var $conversationBlock = jq(e.currentTarget).parent();
  2332. flashConversationBlock($conversationBlock.attr("data-username"));
  2333. $conversationBlock.find(".message_input_area").focus();
  2334. }
  2335. });
  2336. jq.dropdownToggle({
  2337. switcherSelector: ".small_chat_option_icon",
  2338. dropdownID: "smallChatOptionsPopupID",
  2339. addTop: 0,
  2340. addLeft: -6,
  2341. alwaysUp: true
  2342. });
  2343. jq(".small_chat_en_dis_sounds").click(function () {
  2344. handleMenuClickEvent(jq(this), "EnableSound");
  2345. });
  2346. jq(".small_chat_en_dis_ctrl_enter_sender").click(function () {
  2347. handleMenuClickEvent(jq(this), "EnableCtrlEnter");
  2348. });
  2349. jq(".small_chat_minimize_all_windows_if_lose_focus").click(function () {
  2350. handleMenuClickEvent(jq(this), "EnableMinimizeAllWindowsIfLoseFocus");
  2351. });
  2352. var $smallChatCheckbox = jq(".small_chat_en_dis_ctrl_enter_sender").find(".small_chat_checkbox");
  2353. if (localStorageManager.getItem("EnableCtrlEnter")) {
  2354. $smallChatCheckbox.removeClass("small_chat_checkbox_disabled");
  2355. $smallChatCheckbox.addClass("small_chat_checkbox_enabled");
  2356. } else {
  2357. $smallChatCheckbox.removeClass("small_chat_checkbox_enabled");
  2358. $smallChatCheckbox.addClass("small_chat_checkbox_disabled");
  2359. }
  2360. $smallChatCheckbox = jq(".small_chat_en_dis_sounds").find(".small_chat_checkbox");
  2361. if (localStorageManager.getItem("EnableSound") === null) {
  2362. localStorageManager.setItem("EnableSound", true);
  2363. }
  2364. if (localStorageManager.getItem("EnableSound")) {
  2365. $smallChatCheckbox.addClass("small_chat_checkbox_enabled");
  2366. $smallChatCheckbox.removeClass("small_chat_checkbox_disabled");
  2367. } else {
  2368. $smallChatCheckbox.addClass("small_chat_checkbox_disabled");
  2369. $smallChatCheckbox.removeClass("small_chat_checkbox_enabled");
  2370. }
  2371. $smallChatCheckbox = jq(".small_chat_minimize_all_windows_if_lose_focus").find(".small_chat_checkbox");
  2372. if (localStorageManager.getItem("EnableMinimizeAllWindowsIfLoseFocus")) {
  2373. $smallChatCheckbox.removeClass("small_chat_checkbox_disabled");
  2374. $smallChatCheckbox.addClass("small_chat_checkbox_enabled");
  2375. } else {
  2376. $smallChatCheckbox.removeClass("small_chat_checkbox_enabled");
  2377. $smallChatCheckbox.addClass("small_chat_checkbox_disabled");
  2378. }
  2379. }
  2380. }
  2381. function loadTest(userName) {
  2382. var i = 0,
  2383. j = 0;
  2384. setInterval(function () {
  2385. //send
  2386. chat.server.s(userName, "load test" + i++);
  2387. }, 100);
  2388. setInterval(function () {
  2389. //sendStateToTenant
  2390. chat.server.sstt((j++ % 3) + 1);
  2391. }, 100);
  2392. }
  2393. function logoutEvent() {
  2394. if (jq.connection.hub.state !== jq.connection.connectionState.disconnected) {
  2395. connectionStop();
  2396. }
  2397. }
  2398. return {
  2399. init: init,
  2400. openContacts: openContacts,
  2401. extendChat: extendChat,
  2402. minimizeAllWindowsIfLoseFocus: minimizeAllWindowsIfLoseFocus,
  2403. loadTest: loadTest,
  2404. logoutEvent: logoutEvent,
  2405. getUserNumberByStateForConnection: getUserNumberByStateForConnection
  2406. };
  2407. })();
  2408. jq(window).load(function () {
  2409. ASC.Controls.JabberClient.extendChat = SmallChat.extendChat;
  2410. SmallChat.init();
  2411. });