/home/ivoiecob/email.hirewise-va.com/modules/MailWebclient/js/Prefetcher.js
'use strict';
var
_ = require('underscore'),
Types = require('%PathToCoreWebclientModule%/js/utils/Types.js'),
App = require('%PathToCoreWebclientModule%/js/App.js'),
UserSettings = require('%PathToCoreWebclientModule%/js/Settings.js'),
AccountList = require('modules/%ModuleName%/js/AccountList.js'),
Ajax = require('modules/%ModuleName%/js/Ajax.js'),
Settings = require('modules/%ModuleName%/js/Settings.js'),
MailCache = require('modules/%ModuleName%/js/Cache.js'),
Prefetcher = {},
bFetchersIdentitiesPrefetched = false
;
Prefetcher.prefetchFolderLists = function ()
{
if (AccountList.unifiedInboxAllowed() && !AccountList.unifiedInboxReady())
{
var oAccount = _.find(AccountList.collection(), function (oAcct) {
return oAcct.includeInUnifiedMailbox() && !MailCache.oFolderListItems[oAcct.id()];
}, this);
if (oAccount)
{
MailCache.getFolderList(oAccount.id());
return true;
}
else
{
AccountList.unifiedInboxReady(true);
}
}
return false;
};
Prefetcher.prefetchFetchersIdentities = function ()
{
if (!App.isNewTab() && !bFetchersIdentitiesPrefetched && (Settings.AllowFetchers || Settings.AllowIdentities))
{
AccountList.populateFetchersIdentities();
bFetchersIdentitiesPrefetched = true;
return true;
}
return false;
};
Prefetcher.prefetchAccountFilters = function ()
{
var
oAccount = AccountList.getCurrent(),
bFiltersRequested = false
;
if (oAccount && oAccount.allowFilters() && !oAccount.filters())
{
oAccount.requestFilters();
bFiltersRequested = true;
}
return bFiltersRequested;
};
/**
* Prefetches message list with specified parameters. Checks if this list have already prefetched earlier.
* @param {Object} oFolder
* @param {number} iPage
* @param {string} sSearch
* @param {string} sFilters
* @returns {Boolean}
*/
Prefetcher.prefetchMessageList = function (oFolder, iPage, sSearch, sFilters)
{
var
oParams = {
page: iPage,
search: sSearch,
filters: sFilters
},
bDoNotRequest = oFolder.hasListBeenRequested(oParams),
oRequestData = null
;
oRequestData = MailCache.requestMessageList(oFolder.fullName(), oParams.page, oParams.search, oParams.filters,
Settings.MessagesSortBy.DefaultSortBy, Settings.MessagesSortBy.DefaultSortOrder,
false, false, bDoNotRequest);
return !bDoNotRequest && !!oRequestData && oRequestData.RequestStarted;
};
Prefetcher.prefetchStarredMessageList = function ()
{
var
oFolderList = MailCache.folderList(),
oInbox = oFolderList ? oFolderList.inboxFolder() : null,
bRequestStarted = false
;
if (oInbox)
{
bRequestStarted = this.prefetchMessageList(oInbox, 1, '', Enums.FolderFilter.Flagged);
}
return bRequestStarted;
};
Prefetcher.prefetchUnseenMessageList = function ()
{
var
oFolderList = MailCache.folderList(),
oInbox = oFolderList ? oFolderList.inboxFolder() : null,
bRequestStarted = false
;
if (oInbox)
{
bRequestStarted = this.prefetchMessageList(oInbox, 1, '', Enums.FolderFilter.Unseen);
}
return bRequestStarted;
};
/**
* @param {number} iMessageIndex
*/
Prefetcher.prefetchNextPage = function (iMessageIndex)
{
var iPage = Math.ceil(iMessageIndex/Settings.MailsPerPage) + 1;
this.startPagePrefetch(iPage - 1);
};
/**
* @param {number} iMessageIndex
*/
Prefetcher.prefetchPrevPage = function (iMessageIndex)
{
var iPage = Math.ceil((iMessageIndex + 1)/Settings.MailsPerPage) + 1;
this.startPagePrefetch(iPage);
};
/**
* @param {number} iPage
*/
Prefetcher.startPagePrefetch = function (iPage)
{
var
oCurrFolder = MailCache.getCurrentFolder(),
oUidList = MailCache.uidList(),
iOffset = (iPage - 1) * Settings.MailsPerPage,
bPageExists = iPage > 0 && iOffset < oUidList.resultCount(),
bRequestStarted = false
;
if (oCurrFolder && !oCurrFolder.hasChanges() && bPageExists)
{
bRequestStarted = this.prefetchMessageList(oCurrFolder, iPage, oUidList.search(), '');
}
return bRequestStarted;
};
Prefetcher.startUnifiedInboxPrefetch = function ()
{
if (AccountList.unifiedInboxReady())
{
return this.startFolderPrefetch(MailCache.oUnifiedInbox);
}
return false;
};
Prefetcher.startOtherFoldersPrefetch = function ()
{
var
oFolderList = MailCache.folderList(),
sCurrFolder = oFolderList.currentFolderFullName(),
aFoldersFromAccount = MailCache.getNamesOfFoldersToRefresh(MailCache.currentAccountId()),
aSystemFolders = oFolderList ? [oFolderList.inboxFolderFullName(), oFolderList.sentFolderFullName(), oFolderList.draftsFolderFullName(), oFolderList.spamFolderFullName()] : [],
aOtherFolders = (aFoldersFromAccount.length < 5) ? this.getOtherFolderNames(5 - aFoldersFromAccount.length) : [],
aFolders = _.uniq(_.compact(_.union(aSystemFolders, aFoldersFromAccount, aOtherFolders))),
bPrefetchStarted = false
;
_.each(aFolders, _.bind(function (sFolder) {
if (!bPrefetchStarted && sCurrFolder !== sFolder)
{
bPrefetchStarted = this.startFolderPrefetch(oFolderList.getFolderByFullName(sFolder));
}
}, this));
return bPrefetchStarted;
};
/**
* @param {number} iCount
* @returns {Array}
*/
Prefetcher.getOtherFolderNames = function (iCount)
{
var
oInbox = MailCache.folderList().inboxFolder(),
aInboxSubFolders = oInbox ? oInbox.subfolders() : [],
aOtherFolders = _.filter(MailCache.folderList().collection(), function (oFolder) {
return !oFolder.isSystem();
}, this),
aFolders = _.first(_.union(aInboxSubFolders, aOtherFolders), iCount)
;
return _.map(aFolders, function (oFolder) {
return oFolder.fullName();
});
};
/**
* @param {Object} oFolder
*/
Prefetcher.startFolderPrefetch = function (oFolder)
{
var bRequestStarted = false;
if (oFolder)
{
bRequestStarted = this.prefetchMessageList(oFolder, 1, '', '');
}
return bRequestStarted;
};
Prefetcher.startThreadListPrefetch = function ()
{
var
bPrefetchStarted = false,
oUidsForLoad = {}
;
_.each(MailCache.messages(), function (oCacheMess) {
if (oCacheMess && oCacheMess.threadCount && oCacheMess.threadCount() > 0)
{
var
iAccountId = oCacheMess.accountId(),
sFolderFullName = oCacheMess.folder(),
oFolder = MailCache.getFolderByFullName(iAccountId, sFolderFullName),
sFolderId = iAccountId + ':' + sFolderFullName
;
if (!oUidsForLoad[sFolderId])
{
oUidsForLoad[sFolderId] = {
oFolder: oFolder,
aUids: []
};
}
_.each(oCacheMess.threadUids(), function (sThreadUid) {
if (!oFolder.hasThreadUidBeenRequested(sThreadUid))
{
oUidsForLoad[sFolderId].aUids.push(sThreadUid);
}
});
}
}, this);
_.each(oUidsForLoad, function (oUidsData, sFolderId) {
var
oFolder = oUidsData.oFolder,
aUids = oUidsData.aUids
;
if (oFolder && aUids.length > 0)
{
aUids = aUids.slice(0, Settings.MailsPerPage);
oFolder.addRequestedThreadUids(aUids);
oFolder.loadThreadMessages(aUids);
bPrefetchStarted = true;
}
});
return bPrefetchStarted;
};
Prefetcher.startMessagesPrefetch = function (oFolder)
{
var
oPrefetchFolder = oFolder ? oFolder : MailCache.getCurrentFolder(),
bPrefetchStarted = false
;
if (oPrefetchFolder)
{
if (oPrefetchFolder.bIsUnifiedInbox)
{
_.each(AccountList.unifiedMailboxAccounts(), function (oAccount) {
var oInbox = MailCache.oUnifiedInbox.getUnifiedInbox(oAccount.id());
if (oInbox)
{
bPrefetchStarted = bPrefetchStarted || this.startMessagesPrefetchForFolder(oInbox, MailCache.oUnifiedInbox.selected());
}
}, this);
}
else
{
bPrefetchStarted = this.startMessagesPrefetchForFolder(oPrefetchFolder, oPrefetchFolder.selected());
}
}
return bPrefetchStarted;
};
Prefetcher.startMessagesPrefetchForFolder = function (oPrefetchFolder, bFolderSelected)
{
var
iTotalSize = 0,
iMaxSize = Settings.MaxMessagesBodiesSizeToPrefetch,
aUids = [],
oParameters = null,
iJsonSizeOf1Message = 2048,
fFillUids = function (oMsg) {
if (oMsg && _.isFunction(oMsg.uid))
{
var
// might be not from this folder for unified inbox or multi search
bFromThisFolder = oMsg.accountId() === oPrefetchFolder.iAccountId && oMsg.folder() === oPrefetchFolder.fullName(),
bNotFilled = (!oMsg.deleted() && !oMsg.completelyFilled()),
bUidNotAdded = !_.find(aUids, function (sUid) {
return sUid === oMsg.uid();
}, this),
bHasNotBeenRequested = !oPrefetchFolder.hasUidBeenRequested(oMsg.uid()),
iTextSize = oMsg.textSize() < Settings.MessageBodyTruncationThreshold ? oMsg.textSize() : Settings.MessageBodyTruncationThreshold
;
if (iTotalSize < iMaxSize && bFromThisFolder && bNotFilled && bUidNotAdded && bHasNotBeenRequested)
{
aUids.push(oMsg.uid());
iTotalSize += iTextSize + iJsonSizeOf1Message;
}
}
}
;
if (oPrefetchFolder)
{
if (bFolderSelected)
{
_.each(MailCache.messages(), fFillUids);
}
oPrefetchFolder.doForAllMessages(fFillUids);
if (aUids.length > 0)
{
oPrefetchFolder.addRequestedUids(aUids);
oParameters = {
'AccountID': oPrefetchFolder.iAccountId,
'Folder': oPrefetchFolder.fullName(),
'Uids': aUids,
'MessageBodyTruncationThreshold': Settings.MessageBodyTruncationThreshold
};
Ajax.send('GetMessagesBodies', oParameters, this.onGetMessagesBodiesResponse, this);
return true;
}
}
return false;
};
/**
* @param {Object} oResponse
* @param {Object} oRequest
*/
Prefetcher.onGetMessagesBodiesResponse = function (oResponse, oRequest)
{
var
oParameters = oRequest.Parameters,
oFolder = MailCache.getFolderByFullName(oParameters.AccountID, oParameters.Folder)
;
if (_.isArray(oResponse.Result))
{
_.each(oResponse.Result, function (oRawMessage) {
oFolder.parseAndCacheMessage(oRawMessage, false, false);
});
App.broadcastEvent('%ModuleName%::ParseMessagesBodies::after', { AccountID: oParameters.AccountID, Folder: oParameters.Folder });
}
};
Prefetcher.prefetchAccountQuota = function ()
{
var
oAccount = AccountList.getCurrent(),
bNeedQuotaRequest = oAccount && !oAccount.quotaRecieved()
;
if (UserSettings.ShowQuotaBar && bNeedQuotaRequest)
{
oAccount.updateQuotaParams();
return true;
}
return false;
};
/**
* Prefetches templates folder.
*/
Prefetcher.prefetchTemplateFolder = function ()
{
var
oFolderList = MailCache.folderList(),
sTemplateFolder = MailCache.getTemplateFolder()
;
if (sTemplateFolder !== '')
{
return this.startFolderPrefetch(oFolderList.getFolderByFullName(sTemplateFolder));
}
return false;
};
/**
* Prefetches template messages bodies.
*/
Prefetcher.prefetchTemplateMessages = function ()
{
var
oFolderList = MailCache.folderList(),
sTemplateFolder = MailCache.getTemplateFolder(),
oTemplateFolder = sTemplateFolder ? oFolderList.getFolderByFullName(sTemplateFolder) : null
;
if (oTemplateFolder)
{
return this.startMessagesPrefetch(oTemplateFolder);
}
};
module.exports = {
startMin: function () {
var bPrefetchStarted = false;
bPrefetchStarted = Prefetcher.prefetchFetchersIdentities();
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchFolderLists();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchTemplateFolder();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchTemplateMessages();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchAccountFilters();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchStarredMessageList();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchAccountQuota();
}
return bPrefetchStarted;
},
startAll: function () {
var bPrefetchStarted = false;
bPrefetchStarted = Prefetcher.prefetchFetchersIdentities();
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchFolderLists();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchTemplateFolder();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchTemplateMessages();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchAccountFilters();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.startMessagesPrefetch();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.startThreadListPrefetch();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchStarredMessageList();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.startPagePrefetch(MailCache.page() + 1);
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.startPagePrefetch(MailCache.page() - 1);
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchUnseenMessageList();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.prefetchAccountQuota();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.startUnifiedInboxPrefetch();
}
if (!bPrefetchStarted)
{
bPrefetchStarted = Prefetcher.startOtherFoldersPrefetch();
}
return bPrefetchStarted;
},
prefetchStarredMessageList: function () {
Prefetcher.prefetchStarredMessageList();
},
prefetchFolderLists: function () {
return Prefetcher.prefetchFolderLists();
},
startFolderPrefetch: function (oFolder) {
Prefetcher.startFolderPrefetch(oFolder);
},
prefetchNextPage: function (sCurrentUid) {
Prefetcher.prefetchNextPage(sCurrentUid);
},
prefetchPrevPage: function (sCurrentUid) {
Prefetcher.prefetchPrevPage(sCurrentUid);
}
};