芝麻web文件管理V1.00
编辑当前文件:/home/pulsehostuk9/public_html/cloud.pulsehost.co.uk/modules/MailWebclient/js/Cache.js
'use strict'; var _ = require('underscore'), $ = require('jquery'), ko = require('knockout'), moment = require('moment'), TextUtils = require('%PathToCoreWebclientModule%/js/utils/Text.js'), Types = require('%PathToCoreWebclientModule%/js/utils/Types.js'), Utils = require('%PathToCoreWebclientModule%/js/utils/Common.js'), Logger = require('%PathToCoreWebclientModule%/js/utils/Logger.js'), Api = require('%PathToCoreWebclientModule%/js/Api.js'), App = require('%PathToCoreWebclientModule%/js/App.js'), Pulse = require('%PathToCoreWebclientModule%/js/Pulse.js'), Routing = require('%PathToCoreWebclientModule%/js/Routing.js'), UserSettings = require('%PathToCoreWebclientModule%/js/Settings.js'), WindowOpener = require('%PathToCoreWebclientModule%/js/WindowOpener.js'), Popups = require('%PathToCoreWebclientModule%/js/Popups.js'), ConfirmPopup = require('%PathToCoreWebclientModule%/js/popups/ConfirmPopup.js'), LinksUtils = require('modules/%ModuleName%/js/utils/Links.js'), AccountList = require('modules/%ModuleName%/js/AccountList.js'), Ajax = require('modules/%ModuleName%/js/Ajax.js'), MessagesDictionary = require('modules/%ModuleName%/js/MessagesDictionary.js'), Prefetcher = null, Settings = require('modules/%ModuleName%/js/Settings.js'), CFolderModel = require('modules/%ModuleName%/js/models/CFolderModel.js'), CFolderListModel = require('modules/%ModuleName%/js/models/CFolderListModel.js'), CUidListModel = require('modules/%ModuleName%/js/models/CUidListModel.js'), MainTab = App.isNewTab() && window.opener && window.opener.MainTabMailMethods ; /** * @constructor */ function CMailCache() { this.currentAccountId = AccountList.currentId; this.currentAccountId.subscribe(function (iCurrAccountId) { var oAccount = AccountList.getAccount(iCurrAccountId), oFolderList = this.oFolderListItems[iCurrAccountId] ; if (oAccount) { oAccount.quotaRecieved(false); this.messagesLoadingError(false); if (oFolderList) { this.folderList(oFolderList); } else { this.messagesLoading(true); this.folderList(new CFolderListModel()); this.messages([]); this.currentMessage(null); this.getFolderList(iCurrAccountId); } } else { this.folderList(new CFolderListModel()); } }, this); this.editedAccountId = AccountList.editedId; this.editedAccountId.subscribe(function (iEditedAccountId) { var oFolderList = this.oFolderListItems[iEditedAccountId]; if (oFolderList) { this.editedFolderList(oFolderList); } else { this.editedFolderList(new CFolderListModel()); if (this.currentAccountId() !== iEditedAccountId) { this.getFolderList(iEditedAccountId); } } }, this); this.oFolderListItems = {}; this.quotaChangeTrigger = ko.observable(false); this.checkMailStarted = ko.observable(false); this.checkMailStartedAccountId = ko.observable(0); this.folderList = ko.observable(new CFolderListModel()); this.folderListLoading = ko.observableArray([]); this.oUnifiedInbox = new CFolderModel(0, true); this.getCurrentFolder = ko.computed(function () { if (this.oUnifiedInbox.selected()) { return this.oUnifiedInbox; } return this.folderList().currentFolder(); }, this); this.getCurrentFolderFullname = ko.computed(function () { if (this.oUnifiedInbox.selected()) { return this.oUnifiedInbox.fullName(); } return this.folderList().currentFolderFullName(); }, this); this.getCurrentFolderType = ko.computed(function () { if (this.oUnifiedInbox.selected()) { return this.oUnifiedInbox.type(); } return this.folderList().currentFolderType(); }, this); this.editedFolderList = ko.observable(new CFolderListModel()); this.newMessagesCount = ko.computed(function () { if (this.oUnifiedInbox.selected()) { return this.oUnifiedInbox.unseenMessageCount(); } else { var oInbox = this.folderList().inboxFolder(); return oInbox ? oInbox.unseenMessageCount() : 0; } }, this); this.messages = ko.observableArray([]); this.messages.subscribe(function () { if (this.messages().length > 0) { this.messagesLoadingError(false); } if (this.currentMessage()) { var oCurrMessage = _.find(this.messages(), function (oMessage) { return oMessage.longUid() === this.currentMessage().longUid(); }.bind(this)), oFolder = oCurrMessage ? this.getFolderByFullName(oCurrMessage.accountId(), oCurrMessage.folder()) : null ; if (oFolder && !oCurrMessage) { oFolder.getCompletelyFilledMessage(this.currentMessage().longUid(), null, null, true); } } }, this); this.uidList = ko.observable(new CUidListModel()); this.page = ko.observable(1); this.messagesLoading = ko.observable(false); this.messagesLoadingError = ko.observable(false); this.currentMessage = ko.observable(null); this.nextMessageUid = ko.observable(''); this.prevMessageUid = ko.observable(''); this.savingDraftUid = ko.observable(''); this.editedDraftUid = ko.observable(''); this.disableComposeAutosave = ko.observable(false); this.aResponseHandlers = []; this.iAutoCheckMailTimer = -1; this.waitForUnseenMessages = ko.observable(true); this.iSetMessagesSeenCount = 0; App.subscribeEvent('ReceiveAjaxResponse::after', _.bind(function (oParams) { // restart autorefresh after restoring Internet connection if (!this.checkMailStarted() && oParams.Response.Method === 'Ping' && oParams.Response.Module === 'Core' && oParams.Response.Result) { this.executeCheckMail(); } }, this)); } CMailCache.prototype.requirePrefetcher = function () { Prefetcher = require('modules/%ModuleName%/js/Prefetcher.js'); }; /** * @public */ CMailCache.prototype.init = function () { Ajax.registerOnAllRequestsClosedHandler(function () { // Delay not to reset these flags between two related requests (e.g. 'GetRelevantFoldersInformation' and 'GetMessages') _.delay(function () { if (!Ajax.hasOpenedRequests()) { MailCache.checkMailStarted(false); MailCache.folderListLoading.removeAll(); } }, 10); if (!Ajax.hasOpenedRequests()) { // All messages can not be selected from message list if message saving is done MailCache.savingDraftUid(''); } }); if (MainTab) { this.oFolderListItems = MainTab.getFolderListItems(); this.uidList(MainTab.getUidList()); if (window.name) { var iAccountId = Types.pInt(window.name); if (iAccountId === 0) { iAccountId = MainTab.getComposedMessageAccountId(window.name); } if (iAccountId !== 0) { this.currentAccountId(iAccountId); } } this.currentAccountId.valueHasMutated(); this.initPrevNextSubscribes(); } else { this.currentAccountId.valueHasMutated(); this.initPrevNextSubscribes(); } this.oUnifiedInbox.parse({ '@Object': 'Object/Folder', 'Name': TextUtils.i18n('%MODULENAME%/LABEL_FOLDER_ALL_INBOXES'), 'FullNameRaw': '__unified__inbox__', 'FullNameHash': '', 'Delimiter': '/', 'Type': Enums.FolderTypes.AllInboxes, 'AlwaysRefresh': true, 'IsSubscribed': true, 'IsSelectable': true, 'Exists': true, 'SubFolders': [] }, '', ''); }; CMailCache.prototype.initPrevNextSubscribes = function () { this.bInThreadLevel = false; this.currentMessage.subscribe(this.calcNextMessageUid, this); this.uidList.subscribe(this.calcNextMessageUid, this); this.currentMessage.subscribe(this.calcPrevMessageUid, this); this.uidList.subscribe(this.calcPrevMessageUid, this); }; CMailCache.prototype.calcNextMessageUid = function () { var sNextUid = '', oFolder = null, oParentMessage = null, bThreadLevel = false ; if (this.currentMessage() && _.isFunction(this.currentMessage().longUid)) { var sCurrentUid = this.currentMessage().uid(), iMessageIndex = _.indexOf(this.uidList().collection(), sCurrentUid) ; if (iMessageIndex === -1) { sCurrentUid = this.currentMessage().longUid(); iMessageIndex = _.indexOf(this.uidList().collection(), sCurrentUid); } bThreadLevel = this.currentMessage().threadPart() && this.currentMessage().threadParentUid() !== ''; oFolder = this.getFolderByFullName(this.currentMessage().accountId(), this.currentMessage().folder()); if (this.bInThreadLevel || bThreadLevel) { this.bInThreadLevel = !!MainTab; if (bThreadLevel) { oParentMessage = oFolder.getMessageByUid(this.currentMessage().threadParentUid()); if (oParentMessage) { _.each(oParentMessage.threadUids(), function (sUid, iIndex, aCollection) { if (sUid === sCurrentUid && iIndex > 0) { sNextUid = aCollection[iIndex - 1]; } }); if (!Types.isNonEmptyString(sNextUid)) { sNextUid = oParentMessage.longUid(); } } } } else { _.each(this.uidList().collection(), function (sUid, iIndex, aCollection) { if (sUid === sCurrentUid && iIndex > 0) { sNextUid = aCollection[iIndex - 1] || ''; } }); if (sNextUid === '' && MainTab && iMessageIndex !== -1) { this.requirePrefetcher(); Prefetcher.prefetchNextPage(iMessageIndex); } } } this.nextMessageUid(sNextUid); }; CMailCache.prototype.calcPrevMessageUid = function () { var sPrevUid = '', oFolder = null, oParentMessage = null, bThreadLevel = false ; if (this.currentMessage() && _.isFunction(this.currentMessage().longUid)) { var sCurrentUid = this.currentMessage().uid(), iMessageIndex = _.indexOf(this.uidList().collection(), sCurrentUid) ; if (iMessageIndex === -1) { sCurrentUid = this.currentMessage().longUid(); iMessageIndex = _.indexOf(this.uidList().collection(), sCurrentUid); } bThreadLevel = this.currentMessage().threadPart() && this.currentMessage().threadParentUid() !== ''; oFolder = this.getFolderByFullName(this.currentMessage().accountId(), this.currentMessage().folder()); if (this.bInThreadLevel || bThreadLevel) { this.bInThreadLevel = true; if (bThreadLevel) { oParentMessage = oFolder.getMessageByUid(this.currentMessage().threadParentUid()); if (oParentMessage) { _.each(oParentMessage.threadUids(), function (sUid, iIndex, aCollection) { if (sUid === sCurrentUid && (iIndex + 1) < aCollection.length) { sPrevUid = aCollection[iIndex + 1] || ''; } }); } } else if (this.currentMessage().threadCount() > 0) { sPrevUid = this.currentMessage().threadUids()[0]; } } else { _.each(this.uidList().collection(), function (sUid, iIndex, aCollection) { if (sUid === sCurrentUid && (iIndex + 1) < aCollection.length) { sPrevUid = aCollection[iIndex + 1] || ''; } }); if (sPrevUid === '' && MainTab && iMessageIndex !== -1) { this.requirePrefetcher(); Prefetcher.prefetchPrevPage(iMessageIndex); } } } this.prevMessageUid(sPrevUid); }; /** * @param {number} iAccountId * @param {string} sFolderFullName */ CMailCache.prototype.getFolderByFullName = function (iAccountId, sFolderFullName) { if (sFolderFullName === this.oUnifiedInbox.fullName()) { return this.oUnifiedInbox; } var oFolderList = this.oFolderListItems[iAccountId]; if (oFolderList) { return oFolderList.getFolderByFullName(sFolderFullName); } return null; }; CMailCache.prototype.checkCurrentFolderList = function () { var oCurrAccount = AccountList.getCurrent(), oFolderList = oCurrAccount ? this.oFolderListItems[oCurrAccount.id()] : null ; if (oCurrAccount && !oFolderList && !this.messagesLoading()) { this.messagesLoading(true); this.messagesLoadingError(false); this.getFolderList(oCurrAccount.id()); } }; /** * @param {number} iAccountID */ CMailCache.prototype.getFolderList = function (iAccountID) { var oAccount = AccountList.getAccount(iAccountID); if (oAccount) { this.folderListLoading.push(iAccountID); Ajax.send('GetFolders', { 'AccountID': iAccountID }, this.onGetFoldersResponse, this); } else if (iAccountID === this.currentAccountId()) { this.messagesLoading(false); } }; /** * @param {number} iAccountId * @param {string} sFullName * @param {string} sUid * @param {string} sReplyType */ CMailCache.prototype.markMessageReplied = function (iAccountId, sFullName, sUid, sReplyType) { var oFolder = this.getFolderByFullName(iAccountId, sFullName); if (oFolder) { oFolder.markMessageReplied(sUid, sReplyType); } }; /** * @param {Object} oMessage */ CMailCache.prototype.hideThreads = function (oMessage) { var oAccount = AccountList.getCurrent(); if (oAccount && oAccount.threadingIsAvailable() && oMessage.folder() === this.getCurrentFolderFullname() && !oMessage.threadOpened()) { this.getCurrentFolder().hideThreadMessages(oMessage); } }; /** * @param {string} sFolderFullName */ CMailCache.prototype.showOpenedThreads = function (sFolderFullName) { this.messages(this.getMessagesWithThreads(sFolderFullName, this.uidList(), this.messages())); }; /** * @param {Object} oUidList * @returns {Boolean} */ CMailCache.prototype.useThreadingInCurrentList = function (oUidList) { oUidList = oUidList || this.uidList(); var oAccount = AccountList.getCurrent(), oCurrFolder = this.getCurrentFolder(), bFolderWithoutThreads = oCurrFolder && oCurrFolder.withoutThreads(), bNotSearchOrFilters = oUidList.search() === '' && oUidList.filters() === '' ; return oAccount && oAccount.threadingIsAvailable() && !bFolderWithoutThreads && bNotSearchOrFilters; }; /** * @param {string} sFolderFullName * @param {Object} oUidList * @param {Array} aOrigMessages */ CMailCache.prototype.getMessagesWithThreads = function (sFolderFullName, oUidList, aOrigMessages) { var aExtMessages = [], aMessages = [], oCurrFolder = this.getCurrentFolder() ; if (oCurrFolder && (sFolderFullName === oCurrFolder.fullName() || this.oUnifiedInbox.selected() && sFolderFullName === 'INBOX') && this.useThreadingInCurrentList(oUidList)) { aMessages = _.filter(aOrigMessages, function (oMess) { return !oMess.threadPart(); }); _.each(aMessages, function (oMess) { var aThreadMessages = []; aExtMessages.push(oMess); if (oMess.threadCount() > 0) { if (oMess.threadOpened()) { var oFolder = this.getFolderByFullName(oMess.accountId(), oMess.folder()); aThreadMessages = oFolder.getThreadMessages(oMess); aExtMessages = _.union(aExtMessages, aThreadMessages); } oCurrFolder.computeThreadData(oMess); } }, this); return aExtMessages; } return aOrigMessages; }; CMailCache.prototype.getMessageActualIdentifiers = function (iAccountId, sFolder, mUid) { var sUid = Types.pString(mUid), aParts = sUid.split(':') ; if (aParts.length >= 3) { var iAccountId = Types.pInt(aParts[0]), aFolderParts = aParts.slice(1, aParts.length - 1), sFolder = aFolderParts.join(':'), sUid = aParts[aParts.length - 1] ; return { iAccountId: iAccountId, sFolder: sFolder, sUid: sUid }; } return { iAccountId: iAccountId, sFolder: sFolder, sUid: sUid }; }; /** * @param {Object} oUidList * @param {number} iOffset * @param {boolean} bFillMessages */ CMailCache.prototype.setMessagesFromUidList = function (oUidList, iOffset, bFillMessages) { var aUids = oUidList.getUidsForOffset(iOffset), aMessages = _.map(aUids, function (sUid) { var iAccountId = oUidList.iAccountId, sFolder = oUidList.sFullName, oIdentifiers = this.getMessageActualIdentifiers(iAccountId, sFolder, sUid) ; return MessagesDictionary.get([oIdentifiers.iAccountId, oIdentifiers.sFolder, oIdentifiers.sUid]); }, this), iMessagesCount = aMessages.length ; if (bFillMessages) { this.messages(this.getMessagesWithThreads(this.getCurrentFolderFullname(), oUidList, aMessages)); if ((iOffset + iMessagesCount < oUidList.resultCount()) && (iMessagesCount < Settings.MailsPerPage) && (oUidList.filters() !== Enums.FolderFilter.Unseen || this.waitForUnseenMessages())) { this.messagesLoading(true); } if (this.currentMessage() && this.currentMessage().deleted()) { this.currentMessage(null); } } return aUids; }; CMailCache.prototype.getNamesOfFoldersToRefresh = function (iAccountId) { var oFolderList = this.oFolderListItems[iAccountId], aFolders = oFolderList ? oFolderList.getNamesOfFoldersToRefresh() : [], aFoldersFromAccount = AccountList.getCurrentFetchersAndFiltersFolderNames() ; aFolders = _.uniq(_.compact(_.union(aFolders, aFoldersFromAccount))); return aFolders; }; /** * Checks if LIST-STATUS command should be used if it's supported by IMAP server. * @param {int} iAccountId * @param {int} iFoldersToRequestCount */ CMailCache.prototype.getUseListStatusIfPossibleValue = function (iAccountId, iFoldersToRequestCount) { var oFolderList = this.oFolderListItems[iAccountId], iFoldersCount = oFolderList ? oFolderList.getFoldersCount() : 0 ; return iFoldersCount < 100 || iFoldersToRequestCount > 50; }; /** * @param {boolean} bAbortPrevious */ CMailCache.prototype.executeCheckMail = function (bAbortPrevious) { clearTimeout(this.iAutoCheckMailTimer); var iCurrentAccountId = this.currentAccountId(), aFolders = [], aAccountsData = [], bCurrentAccountCheckmailStarted = this.checkMailStarted() && (this.checkMailStartedAccountId() === iCurrentAccountId), bCheckmailAllowed = bAbortPrevious || !Ajax.hasOpenedRequests('GetRelevantFoldersInformation') || !Ajax.hasOpenedRequests('GetUnifiedRelevantFoldersInformation') || !bCurrentAccountCheckmailStarted, oParameters = null ; if (App.getUserRole() !== Enums.UserRole.Anonymous && bCheckmailAllowed) { if (AccountList.unifiedInboxReady()) { _.each(AccountList.collection(), function (oAccount) { if (iCurrentAccountId === oAccount.id() || oAccount.includeInUnifiedMailbox()) { aFolders = this.getNamesOfFoldersToRefresh(oAccount.id()); if (aFolders.length > 0) { aAccountsData.push({ 'AccountID': oAccount.id(), 'Folders': aFolders, 'UseListStatusIfPossible': this.getUseListStatusIfPossibleValue(oAccount.id(), aFolders.length) }); } } }, this); if (aAccountsData.length > 0) { oParameters = { 'AccountsData': aAccountsData }; this.checkMailStarted(true); this.checkMailStartedAccountId(iCurrentAccountId); Ajax.send('GetUnifiedRelevantFoldersInformation', oParameters, this.onGetRelevantFoldersInformationResponse, this); } } else { aFolders = this.getNamesOfFoldersToRefresh(this.currentAccountId()); if (aFolders.length > 0) { oParameters = { 'AccountID': iCurrentAccountId, 'Folders': aFolders, 'UseListStatusIfPossible': this.getUseListStatusIfPossibleValue(iCurrentAccountId, aFolders.length) }; this.checkMailStarted(true); this.checkMailStartedAccountId(iCurrentAccountId); Ajax.send('GetRelevantFoldersInformation', oParameters, this.onGetRelevantFoldersInformationResponse, this); } } } }; CMailCache.prototype.setAutocheckmailTimer = function () { clearTimeout(this.iAutoCheckMailTimer); if (!App.isNewTab() && UserSettings.AutoRefreshIntervalMinutes > 0) { this.iAutoCheckMailTimer = setTimeout(function () { if (!MailCache.isSearchExecuting()) { MailCache.checkMessageFlags(); MailCache.executeCheckMail(false); } }, UserSettings.AutoRefreshIntervalMinutes * 60 * 1000); } }; CMailCache.prototype.isSearchExecuting = function () { var oRequest = Ajax.getOpenedRequest('GetMessages'), oParameters = oRequest && oRequest.Parameters ; return oParameters && oParameters.Search !== ''; }; CMailCache.prototype.checkMessageFlags = function () { var oInbox = this.folderList().inboxFolder(), aUids = oInbox ? oInbox.getFlaggedMessageUids() : [], oParameters = { 'Folder': this.folderList().inboxFolderFullName(), 'Uids': aUids } ; if (aUids.length > 0) { Ajax.send('GetMessagesFlags', oParameters, this.onGetMessagesFlagsResponse, this); } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onGetMessagesFlagsResponse = function (oResponse, oRequest) { var oParameters = oRequest.Parameters, oFolderList = this.oFolderListItems[oParameters.AccountID], oInbox = (oFolderList) ? oFolderList.inboxFolder() : null ; if (oInbox) { if (oResponse.Result) { _.each(oResponse.Result, function (aFlags, sUid) { if (_.indexOf(aFlags, '\\flagged') === -1) { oInbox.setMessageUnflaggedByUid(sUid); } }); } oInbox.removeFlaggedMessageListsFromCache(); this.requirePrefetcher(); Prefetcher.prefetchStarredMessageList(); } }; /** * @param {string} sFolder * @param {number} iPage * @param {string} sSearch * @param {string=} sFilter * @param {string} sSortBy * @param {int} iSortOrder */ CMailCache.prototype.changeCurrentMessageList = function (sFolder, iPage, sSearch, sFilter, sSortBy, iSortOrder) { this.requestCurrentMessageList(sFolder, iPage, sSearch, sFilter, sSortBy, iSortOrder, true); }; /** * @param {string} sFolder * @param {number} iPage * @param {string} sSearch * @param {string} sFilter * @param {string} sSortBy * @param {int} iSortOrder * @param {boolean} bFillMessages */ CMailCache.prototype.requestCurrentMessageList = function (sFolder, iPage, sSearch, sFilter, sSortBy, iSortOrder, bFillMessages) { var oRequestData = this.requestMessageList(sFolder, iPage, sSearch, sFilter || '', sSortBy, iSortOrder, true, (bFillMessages || false)) ; if (oRequestData) { var iCheckmailIntervalMilliseconds = UserSettings.AutoRefreshIntervalMinutes * 60 * 1000, iFolderUpdateDiff = oRequestData.Folder.oRelevantInformationLastMoment ? moment().diff(oRequestData.Folder.oRelevantInformationLastMoment) : iCheckmailIntervalMilliseconds + 1 ; this.uidList(oRequestData.UidList); this.page(iPage); this.messagesLoading(oRequestData.RequestStarted); this.messagesLoadingError(false); if (!oRequestData.RequestStarted && iCheckmailIntervalMilliseconds > 0 && iFolderUpdateDiff > iCheckmailIntervalMilliseconds) { this.executeCheckMail(true); } } }; CMailCache.prototype.isSearchInMultiFolders = function (sSearch) { sSearch = Types.pString(sSearch, this.uidList().search()); return (/(^|\s)folders:(all|sub)(\s|$)/).test(sSearch); }; /** * @param {string} sFolder * @param {number} iPage * @param {string} sSearch * @param {string} sFilters * @param {string} sSortBy * @param {int} iSortOrder * @param {boolean} bCurrent * @param {boolean} bFillMessages * @param {boolean} bDoNotRequest */ CMailCache.prototype.requestMessageList = function (sFolder, iPage, sSearch, sFilters, sSortBy, iSortOrder, bCurrent, bFillMessages, bDoNotRequest) { // Parameter is true if method was called only to update last access time of messages for specified page. // This case is used for Prefetcher work. bDoNotRequest = Types.pBool(bDoNotRequest, false); var oFolder = this.getFolderByFullName(this.currentAccountId(), sFolder); if (!oFolder) { Logger.log('requestMessageList, error: folder not found ', JSON.stringify({ 'currentAccountId': this.currentAccountId(), 'sFolder': sFolder, 'iPage': iPage, 'sSearch': sSearch, 'sFilters': sFilters, 'sSortBy': sSortBy, 'iSortOrder': iSortOrder, 'bCurrent': bCurrent, 'bFillMessages': bFillMessages })); return null; } var bFolderWithoutThreads = oFolder && oFolder.withoutThreads(), oAccount = AccountList.getCurrent(), bUseThreading = oAccount && oAccount.threadingIsAvailable() && !bFolderWithoutThreads && sSearch === '' && sFilters === '', oUidList = (oFolder) ? oFolder.getUidList(sSearch, sFilters, sSortBy, iSortOrder) : null, bCacheIsEmpty = oUidList && oUidList.resultCount() === -1, iOffset = (iPage - 1) * Settings.MailsPerPage, oParameters = { 'Folder': sFolder, 'Offset': iOffset, 'Limit': Settings.MailsPerPage, 'Search': sSearch, 'Filters': sFilters, 'SortBy': sSortBy, 'SortOrder': iSortOrder, 'UseThreading': bUseThreading }, bStartRequest = false, bDataExpected = false, fCallBack = bCurrent ? this.onCurrentGetMessagesResponse : this.onGetMessagesResponse, aUids = [] ; if (sFolder === this.getTemplateFolder() && iOffset === 0 && Settings.MailsPerPage < Settings.MaxTemplatesCountOnCompose && sSearch === '' && sFilters === '' && sSortBy === Settings.MessagesSortBy.DefaultSortBy && iSortOrder === Settings.MessagesSortBy.DefaultSortOrder) { oParameters.Limit = Settings.MaxTemplatesCountOnCompose; } if (oFolder.type() === Enums.FolderTypes.Inbox && sFilters === '') { oParameters['InboxUidnext'] = oFolder.sUidNext; } else { oParameters['InboxUidnext'] = ''; } if (bCacheIsEmpty && oUidList.iAccountId === this.uidList().iAccountId && oUidList.sFullName === this.uidList().sFullName && oUidList.search() === this.uidList().search() && oUidList.filters() === this.uidList().filters() && oUidList.sortBy() === this.uidList().sortBy() && oUidList.sortOrder() === this.uidList().sortOrder()) { oUidList = this.uidList(); } if (oUidList) { aUids = this.setMessagesFromUidList(oUidList, iOffset, bFillMessages); oFolder.updateLastAccessTime(aUids); } if (oUidList) { bDataExpected = (bCacheIsEmpty) || ((iOffset + aUids.length < oUidList.resultCount()) && (aUids.length < Settings.MailsPerPage)) ; bStartRequest = !bDoNotRequest && (oFolder.hasChanges() || bDataExpected); } if (bStartRequest) { if (oParameters.Folder === this.oUnifiedInbox.fullName()) { delete oParameters.Folder; Ajax.send('GetUnifiedMailboxMessages', oParameters, fCallBack, this); } else if (this.isSearchInMultiFolders(oParameters.Search)) { Ajax.send('GetMessagesByFolders', oParameters, fCallBack, this); } else { Ajax.send('GetMessages', oParameters, fCallBack, this); } } else if (bFillMessages && !bDoNotRequest) { this.waitForUnseenMessages(false); } return {UidList: oUidList, RequestStarted: bStartRequest, DataExpected: bDataExpected, Folder: oFolder}; }; CMailCache.prototype.executeEmptyTrash = function () { var oFolder = this.folderList().trashFolder(); if (oFolder) { oFolder.emptyFolder(); } }; CMailCache.prototype.executeEmptySpam = function () { var oFolder = this.folderList().spamFolder(); if (oFolder) { oFolder.emptyFolder(); } }; /** * @param {Object} oFolder */ CMailCache.prototype.onClearFolder = function (oFolder) { if (oFolder && oFolder.selected()) { this.messages.removeAll(); this.currentMessage(null); var oUidList = (oFolder) ? oFolder.getUidList(this.uidList().search(), this.uidList().filters(), this.uidList().sortBy(), this.uidList().sortOrder()) : null; if (oUidList) { oUidList.resultCount(0); this.uidList(oUidList); } else { this.uidList(new CUidListModel()); } // GetRelevantFoldersInformation-request aborted during folder cleaning, not to get the wrong information. // So here indicates that chekmail is over. this.checkMailStarted(false); this.setAutocheckmailTimer(); } }; CMailCache.prototype.getOpenedDraftUids = function () { var aOpenedWins = WindowOpener.getOpenedWindows(), aDraftUids = _.map(aOpenedWins, function (oWin) { return oWin.SlaveTabMailMethods ? oWin.SlaveTabMailMethods.getEditedDraftUid() : ''; }) ; if (Popups.hasOpenedMinimizedPopups()) { aDraftUids.push(this.editedDraftUid()); } return _.uniq(_.compact(aDraftUids)); }; /* * @param {array} aUids */ CMailCache.prototype.closeComposesWithDraftUids = function (aUids) { var aOpenedWins = WindowOpener.getOpenedWindows(); _.each(aOpenedWins, function (oWin) { if (oWin.SlaveTabMailMethods && -1 !== $.inArray(oWin.SlaveTabMailMethods.getEditedDraftUid(), aUids)) { oWin.close(); } }); if (-1 !== $.inArray(this.editedDraftUid(), aUids)) { var ComposeUtils = require('modules/%ModuleName%/js/utils/Compose.js'); if (_.isFunction(ComposeUtils.closeComposePopup)) { ComposeUtils.closeComposePopup(); } } }; /** * @param {object} oFromFolder * @param {object} oToFolder * @param {Array} aUids */ CMailCache.prototype.moveMessagesToFolder = function (oFromFolder, oToFolder, aUids) { if (Types.isNonEmptyArray(aUids)) { var bDraftsFolder = oFromFolder && oFromFolder.type() === Enums.FolderTypes.Drafts, aOpenedDraftUids = bDraftsFolder && this.getOpenedDraftUids(), bTryToDeleteEditedDraft = bDraftsFolder && _.find(aUids, _.bind(function (sUid) { return -1 !== $.inArray(sUid, aOpenedDraftUids); }, this)), oParameters = { 'AccountID': oFromFolder ? oFromFolder.iAccountId : 0, 'Folder': oFromFolder ? oFromFolder.fullName() : '', 'ToFolder': oToFolder.fullName(), 'Uids': aUids.join(',') }, oDiffs = null, fMoveMessages = _.bind(function () { if (this.uidList().filters() === Enums.FolderFilter.Unseen && (this.uidList().resultCount() > Settings.MailsPerPage || this.uidList().resultCount() === -1)) { this.waitForUnseenMessages(true); } oDiffs = oFromFolder.markDeletedByUids(aUids); oToFolder.addMessagesCountsDiff(oDiffs.MinusDiff, oDiffs.UnseenMinusDiff); this.setUnifiedInboxUnseenChanges(oToFolder.iAccountId, oToFolder.fullName(), oDiffs.MinusDiff, oDiffs.UnseenMinusDiff); oToFolder.recivedAnim(true); this.excludeDeletedMessages(); oToFolder.markHasChanges(); Ajax.send('MoveMessages', oParameters, this.onMoveMessagesResponse, this); }, this) ; if (oFromFolder && oToFolder) { if (bTryToDeleteEditedDraft) { this.disableComposeAutosave(true); Popups.showPopup(ConfirmPopup, [TextUtils.i18n('%MODULENAME%/CONFIRM_MESSAGE_FOR_DELETE_IS_EDITED'), _.bind(function (bOk) { if (bOk) { this.closeComposesWithDraftUids(aUids); fMoveMessages(); } this.disableComposeAutosave(false); }, this), '', TextUtils.i18n('%MODULENAME%/ACTION_CLOSE_DELETE_DRAFT') ]); } else { fMoveMessages(); } } } }; CMailCache.prototype.copyMessagesToFolder = function (fromFolder, toFolder, uids) { if (fromFolder && toFolder && uids.length > 0) { var parameters = { 'Folder': fromFolder.fullName(), 'ToFolder': toFolder.fullName(), 'Uids': uids.join(',') }; toFolder.recivedAnim(true); toFolder.markHasChanges(); Ajax.send('CopyMessages', parameters, this.onCopyMessagesResponse, this); } }; CMailCache.prototype.excludeDeletedMessages = function () { _.delay(_.bind(function () { var iOffset = (this.page() - 1) * Settings.MailsPerPage; this.setMessagesFromUidList(this.uidList(), iOffset, true); }, this), 500); }; /** * @param {number} iAccountID * @param {string} sFolderFullName * @param {string} sDraftUid */ CMailCache.prototype.removeOneMessageFromCacheForFolder = function (iAccountID, sFolderFullName, sDraftUid) { var oFolder = this.getFolderByFullName(iAccountID, sFolderFullName); if (oFolder && oFolder.type() === Enums.FolderTypes.Drafts) { if (this.currentMessage() && this.currentMessage().folder() === sFolderFullName && this.currentMessage().longUid() === sDraftUid) { this.currentMessage(null); } oFolder.markDeletedByUids([sDraftUid]); oFolder.commitDeleted([sDraftUid]); } }; /** * @param {number} iAccountID * @param {string} sFolderFullName */ CMailCache.prototype.startMessagesLoadingWhenDraftSaving = function (iAccountID, sFolderFullName) { var oFolder = this.getFolderByFullName(iAccountID, sFolderFullName); if ((oFolder && oFolder.type() === Enums.FolderTypes.Drafts) && oFolder.selected()) { this.messagesLoading(true); } }; /** * @param {number} iAccountID * @param {string} sFolderFullName */ CMailCache.prototype.removeMessagesFromCacheForFolder = function (iAccountID, sFolderFullName) { var oFolder = this.getFolderByFullName(iAccountID, sFolderFullName), sCurrFolderFullName = this.getCurrentFolderFullname() ; if (oFolder) { oFolder.markHasChanges(); if (this.currentAccountId() === iAccountID && sFolderFullName === sCurrFolderFullName) { this.requestCurrentMessageList(sCurrFolderFullName, this.page(), this.uidList().search(), '', this.uidList().sortBy(), this.uidList().sortOrder(), true); } } }; /** * @param {Array} aUids */ CMailCache.prototype.deleteMessages = function (aUids) { var oCurrFolder = this.getCurrentFolder() ; if (oCurrFolder) { this.deleteMessagesFromFolder(oCurrFolder, aUids); } }; /** * @param {Object} oFolder * @param {Array} aUids */ CMailCache.prototype.deleteMessagesFromFolder = function (oFolder, aUids) { var oParameters = { 'AccountID': oFolder.iAccountId, 'Folder': oFolder.fullName(), 'Uids': aUids.join(',') }; oFolder.markDeletedByUids(aUids); this.excludeDeletedMessages(); Ajax.send('DeleteMessages', oParameters, this.onMoveMessagesResponse, this); }; /** * @param {boolean} bAlwaysForSender */ CMailCache.prototype.showExternalPictures = function (bAlwaysForSender) { var oCurrMsg = this.currentMessage(), aFrom = oCurrMsg ? oCurrMsg.oFrom.aCollection : [], oFolder = oCurrMsg ? this.getFolderByFullName(oCurrMsg.accountId(), oCurrMsg.folder()) : null ; if (oFolder) { if (bAlwaysForSender && aFrom.length > 0) { oFolder.alwaysShowExternalPicturesForSender(aFrom[0].sEmail); } else { oFolder.showExternalPictures(oCurrMsg.longUid()); } } }; /** * @param {string} sFolder * @param {string} sFilters */ CMailCache.prototype.setCurrentFolder = function (sFolder, sFilters) { if (!AccountList.unifiedInboxAllowed() && sFolder === this.oUnifiedInbox.fullName()) { sFolder = this.folderList().inboxFolderFullName(); } this.oUnifiedInbox.selected(sFolder === this.oUnifiedInbox.fullName()); this.folderList().setCurrentFolder(sFolder, sFilters); }; /** * @param {number} iAccountId * @param {string} sFolder * @param {string|null} sUid */ CMailCache.prototype.setCurrentMessage = function (iAccountId, sFolder, sUid) { var oFolder = this.getFolderByFullName(iAccountId, sFolder), oMessage = null ; if (oFolder && sUid && oFolder.fullName() === sFolder) { oMessage = MessagesDictionary.get([oFolder.iAccountId, oFolder.fullName(), sUid]); } if (oMessage && !oMessage.deleted()) { this.currentMessage(oMessage); if (Settings.MarkMessageSeenWhenViewing && !this.currentMessage().seen()) { this.executeGroupOperation('SetMessagesSeen', [this.currentMessage().longUid()], 'seen', true); } oFolder.getCompletelyFilledMessage(sUid, this.onCurrentMessageResponse, this); } else { this.currentMessage(null); if (App.isNewTab() && oFolder) { oFolder.getCompletelyFilledMessage(sUid, this.onCurrentMessageResponse, this); } } }; /** * @param {Object} oMessage * @param {string} sUid * @param {Object} oResponse */ CMailCache.prototype.onCurrentMessageResponse = function (oMessage, sUid, oResponse) { var sCurrentUid = this.currentMessage() && this.currentMessage().longUid ? this.currentMessage().longUid() : ''; if (oMessage === null && MainTab && oResponse) { Api.showErrorByCode(oResponse, '', true); } if (oMessage === null && sCurrentUid === sUid) { this.currentMessage(null); } else if (oMessage && sCurrentUid === sUid) { this.currentMessage.valueHasMutated(); } else if (App.isNewTab() && oMessage && this.currentMessage() === null) { this.currentMessage(oMessage); } }; /** * @param {int} iAccountId * @param {string} sFullName * @param {string} sUid * @param {Function} fResponseHandler * @param {Object} oContext */ CMailCache.prototype.getMessage = function (iAccountId, sFullName, sUid, fResponseHandler, oContext) { var oFolder = this.getFolderByFullName(iAccountId, sFullName); if (oFolder) { oFolder.getCompletelyFilledMessage(sUid, fResponseHandler, oContext); } }; CMailCache.prototype.setUnifiedInboxUnseenChanges = function (iAccountId, sFolderFullName, iDiff, iUnseenDiff) { if (AccountList.unifiedInboxReady()) { var oInbox = this.oUnifiedInbox.getUnifiedInbox(iAccountId); if (oInbox && oInbox.fullName() === sFolderFullName) { this.oUnifiedInbox.addMessagesCountsDiff(iDiff, iUnseenDiff); this.oUnifiedInbox.markHasChanges(); } } }; CMailCache.prototype.getUidsSeparatedByFolders = function (aLongUids) { var oUidsByFolders = {}; _.each(aLongUids, function (sLongUid) { var oIdentifiers = this.getMessageActualIdentifiers(this.currentAccountId(), this.getCurrentFolderFullname(), sLongUid); if (oIdentifiers.sUid !== '') { if (!oUidsByFolders[oIdentifiers.iAccountId + ':' + oIdentifiers.sFolder]) { oUidsByFolders[oIdentifiers.iAccountId + ':' + oIdentifiers.sFolder] = { iAccountId: oIdentifiers.iAccountId, sFolder: oIdentifiers.sFolder, aUids: [] }; } oUidsByFolders[oIdentifiers.iAccountId + ':' + oIdentifiers.sFolder].aUids.push(oIdentifiers.sUid); } }.bind(this)); return oUidsByFolders; }; /** * @param {string} sMethod * @param {Array} aUids * @param {string} sField * @param {boolean} bSetAction */ CMailCache.prototype.executeGroupOperation = function (sMethod, aUids, sField, bSetAction) { if (aUids.length === 0) // Mark all read { if (this.oUnifiedInbox.selected()) { _.each(AccountList.unifiedMailboxAccounts(), function (oAccount) { var oInbox = this.oUnifiedInbox.getUnifiedInbox(oAccount.id()); if (oInbox) { this.executeGroupOperationForFolder(sMethod, oInbox, aUids, sField, bSetAction); } }, this); } else { var oCurrFolder = this.getCurrentFolder(); if (oCurrFolder) { this.executeGroupOperationForFolder(sMethod, oCurrFolder, aUids, sField, bSetAction); } } } else { var oUidsByFolders = this.getUidsSeparatedByFolders(aUids); _.each(oUidsByFolders, function (oData) { var oFolderList = this.oFolderListItems[oData.iAccountId], oAccFolder = oFolderList ? oFolderList.getFolderByFullName(oData.sFolder) : null ; if (oAccFolder) { this.executeGroupOperationForFolder(sMethod, oAccFolder, oData.aUids, sField, bSetAction); } }, this); } }; /** * @param {string} sMethod * @param {object} oFolder * @param {Array} aUids * @param {string} sField * @param {boolean} bSetAction */ CMailCache.prototype.executeGroupOperationForFolder = function (sMethod, oFolder, aUids, sField, bSetAction) { var iAccountId = oFolder.iAccountId, oFolderList = this.oFolderListItems[iAccountId], oParameters = { 'AccountID': iAccountId, 'Folder': oFolder.fullName(), 'Uids': aUids.join(','), 'SetAction': bSetAction }, iOffset = (this.page() - 1) * Settings.MailsPerPage, iUidsCount = aUids.length, iStarredCount = oFolderList.oStarredFolder ? oFolderList.oStarredFolder.messageCount() : 0, oStarredUidList = oFolder.getUidList('', Enums.FolderFilter.Flagged, Settings.MessagesSortBy.DefaultSortBy, Settings.MessagesSortBy.DefaultSortOrder), fCallback = (sMethod === 'SetMessagesSeen') ? this.onSetMessagesSeenResponse : function () {} ; if (sMethod === 'SetMessagesSeen') { this.iSetMessagesSeenCount++; } Ajax.send(sMethod, oParameters, fCallback, this); oFolder.executeGroupOperation(sField, aUids, bSetAction); if (oFolder.type() === Enums.FolderTypes.Inbox && sField === 'flagged') { if (this.uidList().filters() === Enums.FolderFilter.Flagged) { if (!bSetAction) { this.uidList().deleteUids(aUids); if (oFolderList.oStarredFolder) { oFolderList.oStarredFolder.messageCount(oStarredUidList.resultCount()); } } } else { oFolder.removeFlaggedMessageListsFromCache(); if (this.uidList().search() === '' && oFolderList.oStarredFolder) { if (bSetAction) { oFolderList.oStarredFolder.messageCount(iStarredCount + iUidsCount); } else { oFolderList.oStarredFolder.messageCount((iStarredCount - iUidsCount > 0) ? iStarredCount - iUidsCount : 0); } } } } if (sField === 'seen') { oFolder.removeUnseenMessageListsFromCache(); } if (this.uidList().filters() !== Enums.FolderFilter.Unseen || this.waitForUnseenMessages()) { this.setMessagesFromUidList(this.uidList(), iOffset, true); } }; /** * private */ /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onSetMessagesSeenResponse = function (oResponse, oRequest) { this.iSetMessagesSeenCount--; if (this.iSetMessagesSeenCount < 0) { this.iSetMessagesSeenCount = 0; } if (this.getCurrentFolder() && this.iSetMessagesSeenCount === 0 && (this.uidList().filters() !== Enums.FolderFilter.Unseen || this.waitForUnseenMessages())) { this.requestCurrentMessageList(this.getCurrentFolder().fullName(), this.page(), this.uidList().search(), this.uidList().filters(), this.uidList().sortBy(), this.uidList().sortOrder(), false); } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onGetFoldersResponse = function (oResponse, oRequest) { var oParameters = oRequest.Parameters, oFolderList = new CFolderListModel(), iAccountId = oParameters.AccountID, oFolderListOld = this.oFolderListItems[iAccountId], oNamedFolderListOld = oFolderListOld ? oFolderListOld.oNamedCollection : {} ; if (oResponse.Result === false) { Api.showErrorByCode(oResponse); if (oParameters.AccountID === this.currentAccountId() && this.messages().length === 0) { this.messagesLoading(false); this.messagesLoadingError(true); } } else { oFolderList.parse(iAccountId, oResponse.Result, oNamedFolderListOld); if (oFolderListOld) { oFolderList.oStarredFolder.messageCount(oFolderListOld.oStarredFolder.messageCount()); } this.__oldFolderList = this.oFolderListItems[iAccountId]; this.oFolderListItems[iAccountId] = oFolderList; // Destroy the old folder list to free up used memory. if (this.__oldFolderList) { this.__oldFolderList.destroyFolders(); Utils.destroyObjectWithObservables(this, '__oldFolderList'); } if (this.currentAccountId() === iAccountId) { this.folderList(oFolderList); } if (this.editedAccountId() === iAccountId) { this.editedFolderList(oFolderList); } this.requirePrefetcher(); if (!Prefetcher.prefetchFolderLists()) { setTimeout(_.bind(this.getAllFoldersRelevantInformation, this, iAccountId), 2000); } } this.folderListLoading.remove(iAccountId); }; /** * @param {number} iAccountId */ CMailCache.prototype.getAllFoldersRelevantInformation = function (iAccountId) { if (AccountList.unifiedInboxReady()) { var aAccountsData = []; _.each(AccountList.collection(), function (oAccount) { var aFolders = []; if (oAccount.id() === iAccountId) { let oFolderList = this.oFolderListItems[iAccountId]; aFolders = oFolderList ? oFolderList.getFoldersWithoutCountInfo() : []; } else if (oAccount.includeInUnifiedMailbox()) { aFolders = this.getNamesOfFoldersToRefresh(iAccountId); } if (aFolders.length > 0) { aAccountsData.push({ 'AccountID': oAccount.id(), 'Folders': aFolders, 'UseListStatusIfPossible': this.getUseListStatusIfPossibleValue(oAccount.id(), aFolders.length) }); } }, this); if (aAccountsData.length > 0) { oParameters = { 'AccountsData': aAccountsData }; Ajax.send('GetUnifiedRelevantFoldersInformation', oParameters, this.onGetRelevantFoldersInformationResponse, this); } } else { var oFolderList = this.oFolderListItems[iAccountId], aFolders = oFolderList ? oFolderList.getFoldersWithoutCountInfo() : [], oParameters = { 'AccountID': iAccountId, 'Folders': aFolders, 'UseListStatusIfPossible': this.getUseListStatusIfPossibleValue(iAccountId, aFolders.length) } ; if (aFolders.length > 0) { Ajax.send('GetRelevantFoldersInformation', oParameters, this.onGetRelevantFoldersInformationResponse, this); } } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onGetRelevantFoldersInformationResponse = function (oResponse, oRequest) { var bCheckMailStarted = false, oParameters = oRequest.Parameters, iAccountId = oParameters.AccountID, oResult = oResponse.Result ; if (oResult === false) { Api.showErrorByCode(oResponse); if (Ajax.hasOpenedRequests('GetRelevantFoldersInformation') || Ajax.hasOpenedRequests('GetUnifiedRelevantFoldersInformation')) { bCheckMailStarted = true; } } else { if (oResult.Unified && oResult.Accounts) { _.each(oResult.Accounts, function (oAccountData) { this.onGetRelevantFoldersInformationResponseForAccount(oAccountData.AccountId, oAccountData.Counts); }, this); var bSameFolder = this.oUnifiedInbox.selected(), aData = oResult.Unified, iCount = aData[0], iUnseenCount = aData[1], sUidNext = aData[2], sHash = aData[3], bFolderHasChanges = this.oUnifiedInbox.setRelevantInformation(sUidNext, sHash, iCount, iUnseenCount, bSameFolder) ; if (bSameFolder && bFolderHasChanges && this.uidList().filters() !== Enums.FolderFilter.Unseen) { this.requestCurrentMessageList(this.getCurrentFolder().fullName(), this.page(), this.uidList().search(), this.uidList().filters(), this.uidList().sortBy(), this.uidList().sortOrder(), false); bCheckMailStarted = true; } } else if (oResult.Counts) { bCheckMailStarted = bCheckMailStarted || this.onGetRelevantFoldersInformationResponseForAccount(iAccountId, oResult.Counts); } } this.checkMailStarted(bCheckMailStarted); if (!this.checkMailStarted()) { this.setAutocheckmailTimer(); } }; CMailCache.prototype.onGetRelevantFoldersInformationResponseForAccount = function (iAccountId, oCounts) { var bCheckMailStarted = false, oFolderList = this.oFolderListItems[iAccountId], bSameAccount = this.currentAccountId() === iAccountId, sCurrentFolderName = this.getCurrentFolderFullname() ; if (oFolderList) { _.each(oCounts, function(aData, sFullName) { if (_.isArray(aData) && aData.length > 3) { var iCount = aData[0], iUnseenCount = aData[1], sUidNext = aData[2], sHash = aData[3], bFolderHasChanges = false, bSameFolder = false, oFolder = null ; oFolder = this.getFolderByFullName(iAccountId, sFullName); if (oFolder) { bSameFolder = bSameAccount && oFolder.fullName() === sCurrentFolderName; bFolderHasChanges = oFolder.setRelevantInformation(sUidNext, sHash, iCount, iUnseenCount, bSameFolder && !this.isSearchInMultiFolders()); if (bSameFolder && bFolderHasChanges && this.uidList().filters() !== Enums.FolderFilter.Unseen) { this.requestCurrentMessageList(oFolder.fullName(), this.page(), this.uidList().search(), this.uidList().filters(), this.uidList().sortBy(), this.uidList().sortOrder(), false); bCheckMailStarted = true; } } } }, this); oFolderList.countsCompletelyFilled(true); } return bCheckMailStarted; }; /** * @param {Object} oResponse */ CMailCache.prototype.showNotificationsForNewMessages = function (oResponse) { var sCurrentFolderName = this.getCurrentFolderFullname(), iNewLength = 0, sUid = '', oParameters = {}, sFrom = '', aBody = [] ; if (oResponse.Result.New && oResponse.Result.New.length > 0) { iNewLength = oResponse.Result.New.length; sUid = oResponse.Result.New[0].Uid; var iAccountId = oResponse.Result.New[0].AccountId; if (sCurrentFolderName === this.oUnifiedInbox.fullName()) { sUid = iAccountId + ':' + sCurrentFolderName + ':' + sUid; } oParameters = { action:'show', icon: 'static/styles/images/logo_140x140.png', title: TextUtils.i18n('%MODULENAME%/INFO_NEW_MESSAGES_PLURAL', { 'COUNT': iNewLength }, null, iNewLength), timeout: 5000, callback: function () { window.focus(); Routing.setHash(LinksUtils.getMailbox(sCurrentFolderName, 1, sUid, '', '')); } }; if (iNewLength === 1) { if (Types.isNonEmptyString(oResponse.Result.New[0].Subject)) { aBody.push(TextUtils.i18n('%MODULENAME%/LABEL_SUBJECT') + ': ' + oResponse.Result.New[0].Subject); } sFrom = (_.map(oResponse.Result.New[0].From, function(oFrom) { return oFrom.DisplayName !== '' ? oFrom.DisplayName : oFrom.Email; })).join(', '); if (Types.isNonEmptyString(sFrom)) { aBody.push(TextUtils.i18n('%MODULENAME%/LABEL_FROM') + ': ' + sFrom); } oParameters.body = aBody.join('\r\n'); } Utils.desktopNotify(oParameters); } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onCurrentGetMessagesResponse = function (oResponse, oRequest) { this.checkMailStarted(false); if (!oResponse.Result) { Logger.log('onCurrentGetMessagesResponse, error ', JSON.stringify(oRequest).substr(0, 300), JSON.stringify(oResponse).substr(0, 300)); Api.showErrorByCode(oResponse); if (this.messagesLoading() === true && (this.messages().length === 0 || oResponse.ErrorCode !== Enums.Errors.NotDisplayedError)) { this.messagesLoadingError(true); } this.messagesLoading(false); this.setAutocheckmailTimer(); } else { this.messagesLoadingError(false); this.parseMessageList(oResponse, oRequest); } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onGetMessagesResponse = function (oResponse, oRequest) { if (oResponse && oResponse.Result) { this.parseMessageList(oResponse, oRequest); } else { Logger.log('onGetMessagesResponse, error ', JSON.stringify(oRequest).substr(0, 300), JSON.stringify(oResponse).substr(0, 300)); } }; CMailCache.prototype.parseAndCacheMessages = function (aMessagesCollection, oFolder, bTrustThreadInfo, aNewFolderMessages) { var oFolders = {}; _.each(aMessagesCollection, function (oRawMessage) { var oIdentifiers = this.getMessageActualIdentifiers(oFolder.iAccountId, oFolder.fullName(), oRawMessage.UnifiedUid || oRawMessage.Uid), oActualFolder = oFolders[oIdentifiers.iAccountId + ':' + oIdentifiers.sFolder] ; if (!oActualFolder) { var oFolderList = this.oFolderListItems[oIdentifiers.iAccountId]; oActualFolder = oFolderList ? oFolderList.getFolderByFullName(oIdentifiers.sFolder) : null; } if (oActualFolder) { var oFolderMessage = oActualFolder.parseAndCacheMessage(oRawMessage, false, bTrustThreadInfo); aNewFolderMessages.push(oFolderMessage); oFolders[oIdentifiers.iAccountId + ':' + oIdentifiers.sFolder] = oActualFolder; } }, this); }; CMailCache.prototype.removeAllMessageListsFromCacheIfHasChanges = function (oFolder) { if (oFolder && oFolder.hasChanges()) { var oFolderList = this.oFolderListItems[oFolder.iAccountId], oNamedCollection = oFolderList ? oFolderList.oNamedCollection : {} ; _.each(oNamedCollection, function (oFolder) { oFolder.removeMultiFoldersMessageListsFromCache(); }, this); this.oUnifiedInbox.removeMultiFoldersMessageListsFromCache(); oFolder.removeAllMessageListsFromCacheIfHasChanges(); } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.parseMessageList = function (oResponse, oRequest) { if (oRequest.Parameters && !Types.isNonEmptyString(oRequest.Parameters.Folder)) { oRequest.Parameters.Folder = this.oUnifiedInbox.fullName(); } var oResult = oResponse.Result, oParameters = oRequest.Parameters, iAccountId = oParameters.AccountID, oFolder = null, oUidList = null, bTrustThreadInfo = oParameters.UseThreading, bHasFolderChanges = false, bCurrentFolder = (this.currentAccountId() === iAccountId || oParameters.Folder === this.oUnifiedInbox.fullName()) && this.getCurrentFolderFullname() === oParameters.Folder, bCurrentList = bCurrentFolder && this.uidList().search() === oResult.Search && this.uidList().filters() === oResult.Filters && this.uidList().sortBy() === oParameters.SortBy && this.uidList().sortOrder() === oParameters.SortOrder, bCurrentPage = this.page() === ((oParameters.Offset / Settings.MailsPerPage) + 1), // !!! aNewFolderMessages = [] ; this.showNotificationsForNewMessages(oResponse); if (oResult !== false && oResult['@Object'] === 'Collection/MessageCollection') { oFolder = this.getFolderByFullName(iAccountId, oParameters.Folder); if (!this.isSearchInMultiFolders(oParameters.Search)) { var bMultiFolderSearchDisplayed = this.isSearchInMultiFolders(), bNotApplyInfoToUI = bCurrentFolder && !bCurrentList && !bMultiFolderSearchDisplayed; // perform before getUidList, because in case of a mismatch the uid list will be pre-cleaned oFolder.setRelevantInformation(oResult.UidNext.toString(), oResult.FolderHash, oResult.MessageCount, oResult.MessageUnseenCount, bNotApplyInfoToUI); } bHasFolderChanges = oFolder.hasChanges(); this.removeAllMessageListsFromCacheIfHasChanges(oFolder); oUidList = oFolder.getUidList(oResult.Search, oResult.Filters, oParameters.SortBy, oParameters.SortOrder); oUidList.setUidsAndCount(oParameters.Offset, oResult); this.parseAndCacheMessages(oResult['@Collection'], oFolder, bTrustThreadInfo, aNewFolderMessages); if (bCurrentList) { this.uidList(oUidList); if (bCurrentPage && (oUidList.filters() !== Enums.FolderFilter.Unseen || this.waitForUnseenMessages())) { this.messagesLoading(false); this.waitForUnseenMessages(false); this.setMessagesFromUidList(oUidList, oParameters.Offset, true); if (!this.messagesLoading()) { this.setAutocheckmailTimer(); } } } if (bHasFolderChanges && bCurrentFolder && (!bCurrentList || !bCurrentPage) && this.uidList().filters() !== Enums.FolderFilter.Unseen) { this.requestCurrentMessageList(this.getCurrentFolderFullname(), this.page(), this.uidList().search(), this.uidList().filters(), this.uidList().sortBy(), this.uidList().sortOrder(), false); } if (oFolder.type() === Enums.FolderTypes.Inbox && oUidList.filters() === Enums.FolderFilter.Flagged && oUidList.search() === '' && this.folderList().oStarredFolder) { this.folderList().oStarredFolder.messageCount(oUidList.resultCount()); this.folderList().oStarredFolder.hasExtendedInfo(true); } } }; CMailCache.prototype.increaseStarredCount = function () { if (this.folderList().oStarredFolder) { this.folderList().oStarredFolder.increaseCountIfHasNotInfo(); } }; CMailCache.prototype.removeMessageFromCurrentList = function (iAccountId, sFolder, sUid) { var oFolder = this.getFolderByFullName(iAccountId, sFolder), oMessage = oFolder ? oFolder.getMessageByUid(sUid) : null ; if (oMessage) { this.messages(_.filter(this.messages(), function (oTempMessage) { return oTempMessage.longUid() !== sUid; })); Routing.replaceHashWithoutMessageUid(oMessage.longUid()); oFolder.markHasChanges(); } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onMoveMessagesResponse = function (oResponse, oRequest) { var oResult = oResponse.Result, oParameters = oRequest.Parameters, aUids = oParameters.Uids.split(','), oFolder = this.getFolderByFullName(oParameters.AccountID, oParameters.Folder), oToFolder = this.getFolderByFullName(oParameters.AccountID, oParameters.ToFolder), bToFolderTrash = (oToFolder && (oToFolder.type() === Enums.FolderTypes.Trash)), bToFolderSpam = (oToFolder && (oToFolder.type() === Enums.FolderTypes.Spam)), oDiffs = null, sConfirm = bToFolderTrash ? TextUtils.i18n('%MODULENAME%/CONFIRM_MESSAGES_DELETE_WITHOUT_TRASH') : TextUtils.i18n('%MODULENAME%/CONFIRM_MESSAGES_MARK_SPAM_WITHOUT_SPAM'), fDeleteMessages = _.bind(function (bResult) { if (bResult && oFolder) { this.deleteMessagesFromFolder(oFolder, aUids); } }, this), oCurrFolder = this.getCurrentFolder(), sCurrFolderFullName = oCurrFolder ? oCurrFolder.fullName() : '', bFillMessages = false ; if (oResult === false) { if (oFolder) { oDiffs = oFolder.revertDeleted(aUids); } if (oToFolder) { if (oDiffs) { oToFolder.addMessagesCountsDiff(-oDiffs.PlusDiff, -oDiffs.UnseenPlusDiff); } if (oResponse.ErrorCode === Enums.MailErrors.CannotMoveMessageQuota && (bToFolderTrash || bToFolderSpam)) { if (Types.isNonEmptyString(oResponse.ErrorMessage)) { sConfirm += ' (' + oResponse.ErrorMessage + ')'; } Popups.showPopup(ConfirmPopup, [sConfirm, fDeleteMessages]); } else { Api.showErrorByCode(oResponse, TextUtils.i18n('%MODULENAME%/ERROR_MOVING_MESSAGES')); } } else { Api.showErrorByCode(oResponse, TextUtils.i18n('%MODULENAME%/ERROR_DELETING_MESSAGES')); } bFillMessages = true; } else if (oFolder) { var aLongUids = _.map(aUids, function (sUid) { return oFolder.iAccountId + ':' + oFolder.fullName() + ':' + Types.pString(sUid); }); this.messages(_.filter(this.messages(), function (oMessage) { return _.indexOf(aLongUids, oMessage && oMessage.longUid && oMessage.longUid()) === -1; })); oFolder.commitDeleted(aUids); _.each(aLongUids, function (sLongUid) { Routing.replaceHashWithoutMessageUid(sLongUid); }); } if (oFolder && sCurrFolderFullName === oFolder.fullName() || oToFolder && sCurrFolderFullName === oToFolder.fullName() || this.isSearchInMultiFolders() || oCurrFolder.bIsUnifiedInbox && (oFolder && oFolder.type() === Enums.FolderTypes.Inbox || oToFolder && oToFolder.type() === Enums.FolderTypes.Inbox)) { oCurrFolder.markHasChanges(); switch (this.uidList().filters()) { case Enums.FolderFilter.Flagged: break; case Enums.FolderFilter.Unseen: if (this.waitForUnseenMessages()) { this.requestCurrentMessageList(sCurrFolderFullName, this.page(), this.uidList().search(), this.uidList().filters(), this.uidList().sortBy(), this.uidList().sortOrder(), bFillMessages); } break; default: this.requestCurrentMessageList(sCurrFolderFullName, this.page(), this.uidList().search(), this.uidList().filters(), this.uidList().sortBy(), this.uidList().sortOrder(), bFillMessages); break; } } else if (oFolder && sCurrFolderFullName !== oFolder.fullName()) { this.requirePrefetcher(); Prefetcher.startFolderPrefetch(oFolder); } else if (oToFolder && sCurrFolderFullName !== oToFolder.fullName()) { this.requirePrefetcher(); Prefetcher.startFolderPrefetch(oToFolder); } }; /** * @param {Object} oResponse * @param {Object} oRequest */ CMailCache.prototype.onCopyMessagesResponse = function (oResponse, oRequest) { var oResult = oResponse.Result, oParameters = oRequest.Parameters, oFolder = this.getFolderByFullName(oParameters.AccountID, oParameters.Folder), oToFolder = this.getFolderByFullName(oParameters.AccountID, oParameters.ToFolder), oCurrFolder = this.getCurrentFolder(), sCurrFolderFullName = oCurrFolder.fullName() ; if (oResult === false) { Api.showErrorByCode(oResponse, TextUtils.i18n('%MODULENAME%/ERROR_COPYING_MESSAGES')); } if (sCurrFolderFullName === oFolder.fullName() || oToFolder && sCurrFolderFullName === oToFolder.fullName()) { oCurrFolder.markHasChanges(); this.requestCurrentMessageList(sCurrFolderFullName, this.page(), this.uidList().search(), '', this.uidList().sortBy(), this.uidList().sortOrder(), false); } else if (sCurrFolderFullName !== oFolder.fullName()) { this.requirePrefetcher(); Prefetcher.startFolderPrefetch(oFolder); } else if (oToFolder && sCurrFolderFullName !== oToFolder.fullName()) { this.requirePrefetcher(); Prefetcher.startFolderPrefetch(oToFolder); } }; /** * @param {string} sSearch */ CMailCache.prototype.searchMessagesInCurrentFolder = function (sSearch) { var sFolder = this.getCurrentFolderFullname() || 'INBOX', sUid = this.currentMessage() ? this.currentMessage().longUid() : '', sFilters = this.uidList().filters() ; Routing.setHash(LinksUtils.getMailbox(sFolder, 1, sUid, sSearch, sFilters)); }; /** * @param {string} sSearch */ CMailCache.prototype.searchMessagesInInbox = function (sSearch) { Routing.setHash(LinksUtils.getMailbox(this.folderList().inboxFolderFullName() || 'INBOX', 1, '', sSearch, '')); }; CMailCache.prototype.getFolderHash = function (sFolder) { return Routing.buildHashFromArray(LinksUtils.getMailbox(sFolder, 1, '', '', '')); }; CMailCache.prototype.countMessages = function (oCountedFolder) { var aSubfoldersMessagesCount = [], fCountRecursively = function(oFolder) { _.each(oFolder.subfolders(), function(oSubFolder, iKey) { if(oSubFolder.subscribed()) { aSubfoldersMessagesCount.push(oSubFolder.unseenMessageCount()); if (oSubFolder.subfolders().length && oSubFolder.subscribed()) { fCountRecursively(oSubFolder); } } }, this); } ; if (oCountedFolder.expanded() || oCountedFolder.bNamespace) { oCountedFolder.subfoldersMessagesCount(0); } else { fCountRecursively(oCountedFolder); oCountedFolder.subfoldersMessagesCount( _.reduce(aSubfoldersMessagesCount, function(memo, num){ return memo + num; }, 0) ); } }; CMailCache.prototype.changeDatesInMessages = function () { MessagesDictionary.updateMomentDates(); }; /** * Clears messages cache for specified account. * @param {number} iAccountId */ CMailCache.prototype.clearMessagesCache = function (iAccountId) { var oFolderList = this.oFolderListItems[iAccountId]; _.each(oFolderList.collection(), function (oFolder) { oFolder.markHasChanges(); this.removeAllMessageListsFromCacheIfHasChanges(oFolder); }, this); if (iAccountId === this.currentAccountId()) { this.messages([]); } }; CMailCache.prototype.getTemplateFolder = function () { var oFolderList = this.folderList(), sFolder = '', sCurrentFolder = oFolderList.currentFolder() ? oFolderList.currentFolder().fullName() : '' ; if (Types.isNonEmptyArray(this.getCurrentTemplateFolders())) { if (-1 !== $.inArray(sCurrentFolder, this.getCurrentTemplateFolders())) { sFolder = sCurrentFolder; } else { sFolder = _.find(this.getCurrentTemplateFolders(), function (sTempFolder) { return !!oFolderList.oNamedCollection[sTempFolder]; }); } } return typeof(sFolder) === 'string' ? sFolder : ''; }; CMailCache.prototype.getCurrentTemplateFolders = function () { return Settings.AllowTemplateFolders ? this.folderList().aTemplateFolders : []; }; CMailCache.prototype.isTemplateFolder = function (folderFullName) { return -1 !== $.inArray(folderFullName, this.getCurrentTemplateFolders()); }; CMailCache.prototype.changeTemplateFolder = function (sFolderName, bTemplate) { if (Settings.AllowTemplateFolders) { this.folderList().changeTemplateFolder(sFolderName, bTemplate); } }; var MailCache = new CMailCache(); Pulse.registerDayOfMonthFunction(_.bind(MailCache.changeDatesInMessages, MailCache)); UserSettings.timeFormat.subscribe(MailCache.changeDatesInMessages, MailCache); UserSettings.dateFormat.subscribe(MailCache.changeDatesInMessages, MailCache); module.exports = MailCache;