snappymail/dev/App/User.js

1608 lines
40 KiB
JavaScript
Raw Normal View History

2014-09-05 06:49:03 +08:00
(function () {
2014-08-26 14:31:20 +08:00
2014-08-25 23:49:01 +08:00
'use strict';
2014-08-20 23:03:12 +08:00
var
2014-08-25 23:49:01 +08:00
window = require('window'),
_ = require('_'),
$ = require('$'),
2014-08-25 23:49:01 +08:00
moment = require('moment'),
2014-09-19 23:24:38 +08:00
SimplePace = require('SimplePace'),
2014-08-25 15:10:51 +08:00
2014-09-05 06:49:03 +08:00
Enums = require('Common/Enums'),
Globals = require('Common/Globals'),
Consts = require('Common/Consts'),
Plugins = require('Common/Plugins'),
Utils = require('Common/Utils'),
2014-10-06 02:37:31 +08:00
Links = require('Common/Links'),
2014-09-05 06:49:03 +08:00
Events = require('Common/Events'),
Translator = require('Common/Translator'),
2014-08-21 23:08:34 +08:00
kn = require('Knoin/Knoin'),
2014-08-27 23:59:44 +08:00
SocialStore = require('Stores/Social'),
UserSettingsStore = require('Stores/UserSettings'),
Local = require('Storage/Local'),
Settings = require('Storage/Settings'),
2014-10-18 21:43:44 +08:00
Data = require('Storage/User/Data'),
Cache = require('Storage/User/Cache'),
Remote = require('Storage/User/Remote'),
2014-08-27 23:59:44 +08:00
EmailModel = require('Model/Email'),
FolderModel = require('Model/Folder'),
MessageModel = require('Model/Message'),
AccountModel = require('Model/Account'),
IdentityModel = require('Model/Identity'),
OpenPgpKeyModel = require('Model/OpenPgpKey'),
2014-08-27 23:59:44 +08:00
AbstractApp = require('App/Abstract')
2014-08-20 23:03:12 +08:00
;
/**
* @constructor
* @extends AbstractApp
*/
2014-10-18 21:43:44 +08:00
function AppUser()
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
AbstractApp.call(this, Remote);
2014-08-20 23:03:12 +08:00
this.oMoveCache = {};
2014-08-20 23:03:12 +08:00
this.quotaDebounce = _.debounce(this.quota, 1000 * 30);
this.moveOrDeleteResponseHelper = _.bind(this.moveOrDeleteResponseHelper, this);
2014-08-20 23:03:12 +08:00
this.messagesMoveTrigger = _.debounce(this.messagesMoveTrigger, 500);
2014-08-20 23:03:12 +08:00
window.setInterval(function () {
2014-08-22 23:08:56 +08:00
Events.pub('interval.30s');
2014-08-20 23:03:12 +08:00
}, 30000);
window.setInterval(function () {
2014-08-22 23:08:56 +08:00
Events.pub('interval.1m');
2014-08-20 23:03:12 +08:00
}, 60000);
2014-08-20 23:03:12 +08:00
window.setInterval(function () {
2014-08-22 23:08:56 +08:00
Events.pub('interval.2m');
2014-08-20 23:03:12 +08:00
}, 60000 * 2);
2014-08-20 23:03:12 +08:00
window.setInterval(function () {
2014-08-22 23:08:56 +08:00
Events.pub('interval.3m');
2014-08-20 23:03:12 +08:00
}, 60000 * 3);
2014-08-20 23:03:12 +08:00
window.setInterval(function () {
2014-08-22 23:08:56 +08:00
Events.pub('interval.5m');
2014-08-20 23:03:12 +08:00
}, 60000 * 5);
window.setInterval(function () {
2014-08-22 23:08:56 +08:00
Events.pub('interval.10m');
}, 60000 * 10);
window.setInterval(function () {
Events.pub('interval.15m');
}, 60000 * 15);
window.setInterval(function () {
Events.pub('interval.20m');
}, 60000 * 15);
window.setTimeout(function () {
window.setInterval(function () {
Events.pub('interval.5m-after5m');
}, 60000 * 5);
}, 60000 * 5);
2014-08-20 23:03:12 +08:00
window.setTimeout(function () {
window.setInterval(function () {
2014-08-22 23:08:56 +08:00
Events.pub('interval.10m-after5m');
2014-08-20 23:03:12 +08:00
}, 60000 * 10);
}, 60000 * 5);
$.wakeUp(function () {
2014-08-25 15:10:51 +08:00
2014-08-21 23:08:34 +08:00
Remote.jsVersion(function (sResult, oData) {
2014-08-20 23:03:12 +08:00
if (Enums.StorageResultType.Success === sResult && oData && !oData.Result)
{
2014-08-27 23:59:44 +08:00
if (window.parent && !!Settings.settingsGet('InIframe'))
2014-08-20 23:03:12 +08:00
{
window.parent.location.reload();
}
else
{
window.location.reload();
}
}
2014-08-27 23:59:44 +08:00
}, Settings.settingsGet('Version'));
2014-08-25 15:10:51 +08:00
2014-08-20 23:03:12 +08:00
}, {}, 60 * 60 * 1000);
2014-08-22 23:08:56 +08:00
if (Settings.settingsGet('UserBackgroundHash'))
{
_.delay(function () {
$('#rl-bg').backstretch(Links.publicLink(Settings.settingsGet('UserBackgroundHash')), {
'fade': Globals.bAnimationSupported ? 1000 : 0
});
}, 3000);
}
2014-08-22 23:08:56 +08:00
this.socialUsers = _.bind(this.socialUsers, this);
}
2014-10-18 21:43:44 +08:00
_.extend(AppUser.prototype, AbstractApp.prototype);
2014-08-20 23:03:12 +08:00
2014-10-18 21:43:44 +08:00
AppUser.prototype.remote = function ()
2014-08-22 23:08:56 +08:00
{
return Remote;
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.data = function ()
{
2014-08-22 23:08:56 +08:00
return Data;
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.reloadFlagsCurrentMessageListAndMessageFromCache = function ()
{
2014-08-21 23:08:34 +08:00
_.each(Data.messageList(), function (oMessage) {
Cache.initMessageFlagsFromCache(oMessage);
2014-08-20 23:03:12 +08:00
});
2014-08-21 23:08:34 +08:00
Cache.initMessageFlagsFromCache(Data.message());
2014-08-20 23:03:12 +08:00
};
2014-08-20 23:03:12 +08:00
/**
* @param {boolean=} bDropPagePosition = false
* @param {boolean=} bDropCurrenFolderCache = false
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.reloadMessageList = function (bDropPagePosition, bDropCurrenFolderCache)
2014-08-20 23:03:12 +08:00
{
var
2014-08-22 23:08:56 +08:00
self = this,
iOffset = (Data.messageListPage() - 1) * UserSettingsStore.messagesPerPage()
2014-08-20 23:03:12 +08:00
;
if (Utils.isUnd(bDropCurrenFolderCache) ? false : !!bDropCurrenFolderCache)
{
2014-08-21 23:08:34 +08:00
Cache.setFolderHash(Data.currentFolderFullNameRaw(), '');
}
2014-08-20 23:03:12 +08:00
if (Utils.isUnd(bDropPagePosition) ? false : !!bDropPagePosition)
{
2014-08-21 23:08:34 +08:00
Data.messageListPage(1);
2014-08-20 23:03:12 +08:00
iOffset = 0;
}
2014-08-21 23:08:34 +08:00
Data.messageListLoading(true);
Remote.messageList(function (sResult, oData, bCached) {
2014-08-20 23:03:12 +08:00
if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
{
2014-08-21 23:08:34 +08:00
Data.messageListError('');
Data.messageListLoading(false);
2014-08-22 23:08:56 +08:00
self.setMessageList(oData, bCached);
2014-08-20 23:03:12 +08:00
}
else if (Enums.StorageResultType.Unload === sResult)
{
2014-08-21 23:08:34 +08:00
Data.messageListError('');
Data.messageListLoading(false);
2014-08-20 23:03:12 +08:00
}
else if (Enums.StorageResultType.Abort !== sResult)
{
2014-08-21 23:08:34 +08:00
Data.messageList([]);
Data.messageListLoading(false);
Data.messageListError(oData && oData.ErrorCode ?
Translator.getNotification(oData.ErrorCode) : Translator.i18n('NOTIFICATIONS/CANT_GET_MESSAGE_LIST')
2014-08-20 23:03:12 +08:00
);
}
}, Data.currentFolderFullNameRaw(), iOffset, UserSettingsStore.messagesPerPage(), Data.messageListSearch());
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.recacheInboxMessageList = function ()
2014-08-20 23:03:12 +08:00
{
Remote.messageList(Utils.emptyFunction, Cache.getFolderInboxName(), 0, UserSettingsStore.messagesPerPage(), '', true);
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.reloadMessageListHelper = function (bEmptyList)
2014-08-20 23:03:12 +08:00
{
2014-08-25 15:10:51 +08:00
this.reloadMessageList(bEmptyList);
2014-08-20 23:03:12 +08:00
};
/**
* @param {Function} fResultFunc
* @returns {boolean}
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.contactsSync = function (fResultFunc)
2014-08-20 23:03:12 +08:00
{
2014-08-21 23:08:34 +08:00
var oContacts = Data.contacts;
if (oContacts.importing() || oContacts.syncing() || !Data.enableContactsSync() || !Data.allowContactsSync())
{
2014-08-20 23:03:12 +08:00
return false;
}
2014-08-20 23:03:12 +08:00
oContacts.syncing(true);
2014-08-21 23:08:34 +08:00
Remote.contactsSync(function (sResult, oData) {
2014-08-20 23:03:12 +08:00
oContacts.syncing(false);
2014-08-20 23:03:12 +08:00
if (fResultFunc)
{
fResultFunc(sResult, oData);
}
});
2014-08-20 23:03:12 +08:00
return true;
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.messagesMoveTrigger = function ()
{
2014-08-20 23:03:12 +08:00
var
self = this,
2014-08-21 23:08:34 +08:00
sSpamFolder = Data.spamFolder()
2014-08-20 23:03:12 +08:00
;
2014-08-20 23:03:12 +08:00
_.each(this.oMoveCache, function (oItem) {
2014-08-20 23:03:12 +08:00
var
bSpam = sSpamFolder === oItem['To'],
bHam = !bSpam && sSpamFolder === oItem['From'] && Cache.getFolderInboxName() === oItem['To']
2014-08-20 23:03:12 +08:00
;
2014-03-20 00:18:28 +08:00
2014-08-21 23:08:34 +08:00
Remote.messagesMove(self.moveOrDeleteResponseHelper, oItem['From'], oItem['To'], oItem['Uid'],
2014-08-20 23:03:12 +08:00
bSpam ? 'SPAM' : (bHam ? 'HAM' : ''));
});
2014-03-20 00:18:28 +08:00
2014-08-20 23:03:12 +08:00
this.oMoveCache = {};
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.messagesMoveHelper = function (sFromFolderFullNameRaw, sToFolderFullNameRaw, aUidForMove)
2014-03-20 00:18:28 +08:00
{
2014-08-20 23:03:12 +08:00
var sH = '$$' + sFromFolderFullNameRaw + '$$' + sToFolderFullNameRaw + '$$';
if (!this.oMoveCache[sH])
2014-03-20 00:18:28 +08:00
{
2014-08-20 23:03:12 +08:00
this.oMoveCache[sH] = {
'From': sFromFolderFullNameRaw,
'To': sToFolderFullNameRaw,
'Uid': []
};
2014-03-20 00:18:28 +08:00
}
2014-08-20 23:03:12 +08:00
this.oMoveCache[sH]['Uid'] = _.union(this.oMoveCache[sH]['Uid'], aUidForMove);
this.messagesMoveTrigger();
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.messagesCopyHelper = function (sFromFolderFullNameRaw, sToFolderFullNameRaw, aUidForCopy)
2014-03-20 00:18:28 +08:00
{
2014-08-21 23:08:34 +08:00
Remote.messagesCopy(
2014-08-20 23:03:12 +08:00
this.moveOrDeleteResponseHelper,
sFromFolderFullNameRaw,
sToFolderFullNameRaw,
aUidForCopy
);
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.messagesDeleteHelper = function (sFromFolderFullNameRaw, aUidForRemove)
2014-03-20 00:18:28 +08:00
{
2014-08-21 23:08:34 +08:00
Remote.messagesDelete(
2014-08-20 23:03:12 +08:00
this.moveOrDeleteResponseHelper,
sFromFolderFullNameRaw,
aUidForRemove
);
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.moveOrDeleteResponseHelper = function (sResult, oData)
2014-08-20 23:03:12 +08:00
{
2014-08-21 23:08:34 +08:00
if (Enums.StorageResultType.Success === sResult && Data.currentFolder())
2014-03-20 00:18:28 +08:00
{
2014-08-20 23:03:12 +08:00
if (oData && Utils.isArray(oData.Result) && 2 === oData.Result.length)
{
2014-08-21 23:08:34 +08:00
Cache.setFolderHash(oData.Result[0], oData.Result[1]);
}
else
{
2014-08-21 23:08:34 +08:00
Cache.setFolderHash(Data.currentFolderFullNameRaw(), '');
2014-08-20 23:03:12 +08:00
if (oData && -1 < Utils.inArray(oData.ErrorCode,
[Enums.Notification.CantMoveMessage, Enums.Notification.CantCopyMessage]))
{
window.alert(Translator.getNotification(oData.ErrorCode));
2014-08-20 23:03:12 +08:00
}
}
2014-03-20 00:18:28 +08:00
2014-08-22 23:08:56 +08:00
this.reloadMessageListHelper(0 === Data.messageList().length);
this.quotaDebounce();
2014-03-20 00:18:28 +08:00
}
2014-08-20 23:03:12 +08:00
};
2014-03-20 00:18:28 +08:00
2014-08-20 23:03:12 +08:00
/**
* @param {string} sFromFolderFullNameRaw
* @param {Array} aUidForRemove
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.deleteMessagesFromFolderWithoutCheck = function (sFromFolderFullNameRaw, aUidForRemove)
2014-08-20 23:03:12 +08:00
{
this.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove);
2014-08-21 23:08:34 +08:00
Data.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove);
2014-08-20 23:03:12 +08:00
};
/**
* @param {number} iDeleteType
* @param {string} sFromFolderFullNameRaw
* @param {Array} aUidForRemove
* @param {boolean=} bUseFolder = true
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.deleteMessagesFromFolder = function (iDeleteType, sFromFolderFullNameRaw, aUidForRemove, bUseFolder)
2014-08-20 23:03:12 +08:00
{
var
self = this,
oMoveFolder = null,
nSetSystemFoldersNotification = null
;
2014-03-20 00:18:28 +08:00
2014-08-20 23:03:12 +08:00
switch (iDeleteType)
{
case Enums.FolderType.Spam:
2014-08-21 23:08:34 +08:00
oMoveFolder = Cache.getFolderFromCacheList(Data.spamFolder());
2014-08-20 23:03:12 +08:00
nSetSystemFoldersNotification = Enums.SetSystemFoldersNotification.Spam;
break;
case Enums.FolderType.NotSpam:
oMoveFolder = Cache.getFolderFromCacheList(Cache.getFolderInboxName());
2014-08-20 23:03:12 +08:00
break;
case Enums.FolderType.Trash:
2014-08-21 23:08:34 +08:00
oMoveFolder = Cache.getFolderFromCacheList(Data.trashFolder());
2014-08-20 23:03:12 +08:00
nSetSystemFoldersNotification = Enums.SetSystemFoldersNotification.Trash;
break;
case Enums.FolderType.Archive:
2014-08-21 23:08:34 +08:00
oMoveFolder = Cache.getFolderFromCacheList(Data.archiveFolder());
2014-08-20 23:03:12 +08:00
nSetSystemFoldersNotification = Enums.SetSystemFoldersNotification.Archive;
break;
}
2014-08-20 23:03:12 +08:00
bUseFolder = Utils.isUnd(bUseFolder) ? true : !!bUseFolder;
if (bUseFolder)
{
2014-08-21 23:08:34 +08:00
if ((Enums.FolderType.Spam === iDeleteType && Consts.Values.UnuseOptionValue === Data.spamFolder()) ||
(Enums.FolderType.Trash === iDeleteType && Consts.Values.UnuseOptionValue === Data.trashFolder()) ||
(Enums.FolderType.Archive === iDeleteType && Consts.Values.UnuseOptionValue === Data.archiveFolder()))
{
2014-08-20 23:03:12 +08:00
bUseFolder = false;
}
}
2014-08-20 23:03:12 +08:00
if (!oMoveFolder && bUseFolder)
{
kn.showScreenPopup(require('View/Popup/FolderSystem'), [nSetSystemFoldersNotification]);
}
2014-08-20 23:03:12 +08:00
else if (!bUseFolder || (Enums.FolderType.Trash === iDeleteType &&
2014-08-21 23:08:34 +08:00
(sFromFolderFullNameRaw === Data.spamFolder() || sFromFolderFullNameRaw === Data.trashFolder())))
2014-08-20 23:03:12 +08:00
{
kn.showScreenPopup(require('View/Popup/Ask'), [Translator.i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), function () {
2014-08-20 23:03:12 +08:00
self.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove);
2014-08-21 23:08:34 +08:00
Data.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove);
2014-08-20 23:03:12 +08:00
}]);
}
else if (oMoveFolder)
{
this.messagesMoveHelper(sFromFolderFullNameRaw, oMoveFolder.fullNameRaw, aUidForRemove);
2014-08-21 23:08:34 +08:00
Data.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, oMoveFolder.fullNameRaw);
2014-08-20 23:03:12 +08:00
}
};
/**
* @param {string} sFromFolderFullNameRaw
* @param {Array} aUidForMove
* @param {string} sToFolderFullNameRaw
* @param {boolean=} bCopy = false
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.moveMessagesToFolder = function (sFromFolderFullNameRaw, aUidForMove, sToFolderFullNameRaw, bCopy)
{
2014-08-20 23:03:12 +08:00
if (sFromFolderFullNameRaw !== sToFolderFullNameRaw && Utils.isArray(aUidForMove) && 0 < aUidForMove.length)
{
var
2014-08-21 23:08:34 +08:00
oFromFolder = Cache.getFolderFromCacheList(sFromFolderFullNameRaw),
oToFolder = Cache.getFolderFromCacheList(sToFolderFullNameRaw)
2014-08-20 23:03:12 +08:00
;
2014-08-20 23:03:12 +08:00
if (oFromFolder && oToFolder)
{
2014-08-20 23:03:12 +08:00
if (Utils.isUnd(bCopy) ? false : !!bCopy)
2014-03-21 07:47:13 +08:00
{
2014-08-20 23:03:12 +08:00
this.messagesCopyHelper(oFromFolder.fullNameRaw, oToFolder.fullNameRaw, aUidForMove);
}
else
{
this.messagesMoveHelper(oFromFolder.fullNameRaw, oToFolder.fullNameRaw, aUidForMove);
2014-03-21 07:47:13 +08:00
}
2014-08-21 23:08:34 +08:00
Data.removeMessagesFromList(oFromFolder.fullNameRaw, aUidForMove, oToFolder.fullNameRaw, bCopy);
2014-08-20 23:03:12 +08:00
return true;
}
}
2014-08-20 23:03:12 +08:00
return false;
};
2014-08-20 23:03:12 +08:00
/**
* @param {Function=} fCallback
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.folders = function (fCallback)
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
Data.foldersLoading(true);
2014-08-22 23:08:56 +08:00
Remote.folders(_.bind(function (sResult, oData) {
var bResult = false;
2014-08-21 23:08:34 +08:00
Data.foldersLoading(false);
if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
2014-08-20 23:03:12 +08:00
{
bResult = true;
2014-08-22 23:08:56 +08:00
this.setFolders(oData);
2014-08-20 23:03:12 +08:00
}
if (fCallback)
2014-08-20 23:03:12 +08:00
{
fCallback(bResult);
2014-08-20 23:03:12 +08:00
}
2014-08-20 23:03:12 +08:00
}, this));
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.reloadOpenPgpKeys = function ()
2014-08-20 23:03:12 +08:00
{
2014-08-21 23:08:34 +08:00
if (Data.capaOpenPGP())
{
var
2014-08-20 23:03:12 +08:00
aKeys = [],
oEmail = new EmailModel(),
2014-08-21 23:08:34 +08:00
oOpenpgpKeyring = Data.openpgpKeyring,
2014-08-20 23:03:12 +08:00
oOpenpgpKeys = oOpenpgpKeyring ? oOpenpgpKeyring.getAllKeys() : []
;
2014-08-20 23:03:12 +08:00
_.each(oOpenpgpKeys, function (oItem, iIndex) {
if (oItem && oItem.primaryKey)
{
var
2014-08-20 23:03:12 +08:00
oPrimaryUser = oItem.getPrimaryUser(),
sUser = (oPrimaryUser && oPrimaryUser.user) ? oPrimaryUser.user.userId.userid
: (oItem.users && oItem.users[0] ? oItem.users[0].userId.userid : '')
;
2014-08-20 23:03:12 +08:00
oEmail.clear();
oEmail.mailsoParse(sUser);
2014-08-20 23:03:12 +08:00
if (oEmail.validate())
{
aKeys.push(new OpenPgpKeyModel(
iIndex,
oItem.primaryKey.getFingerprint(),
oItem.primaryKey.getKeyId().toHex().toLowerCase(),
sUser,
oEmail.email,
oItem.isPrivate(),
oItem.armor())
);
}
}
});
2014-10-04 19:58:01 +08:00
Utils.delegateRunOnDestroy(Data.openpgpkeys());
2014-08-21 23:08:34 +08:00
Data.openpgpkeys(aKeys);
}
2014-08-20 23:03:12 +08:00
};
AppUser.prototype.accountsCounts = function ()
{
Remote.accountsCounts(function (sResult, oData) {
if (Enums.StorageResultType.Success === sResult && oData.Result && oData.Result['Counts'])
{
var aAcounts = Data.accounts();
_.each(oData.Result['Counts'], function (oItem) {
var oAccount = _.find(aAcounts, function (oAccount) {
return oAccount && oItem[0] === oAccount.email;
});
if (oAccount)
{
oAccount.count(Utils.pInt(oItem[1]));
}
});
}
});
};
AppUser.prototype.accountsAndIdentities = function (bBoot)
2013-12-07 06:45:46 +08:00
{
var self = this;
2014-08-21 23:08:34 +08:00
Data.accountsLoading(true);
Data.identitiesLoading(true);
2014-08-21 23:08:34 +08:00
Remote.accountsAndIdentities(function (sResult, oData) {
2014-08-21 23:08:34 +08:00
Data.accountsLoading(false);
Data.identitiesLoading(false);
2014-08-20 23:03:12 +08:00
if (Enums.StorageResultType.Success === sResult && oData.Result)
{
var
aCounts = {},
2014-08-27 23:59:44 +08:00
sParentEmail = Settings.settingsGet('ParentEmail'),
2014-08-21 23:08:34 +08:00
sAccountEmail = Data.accountEmail()
2014-08-20 23:03:12 +08:00
;
2013-12-07 06:45:46 +08:00
2014-08-20 23:03:12 +08:00
sParentEmail = '' === sParentEmail ? sAccountEmail : sParentEmail;
2014-08-20 23:03:12 +08:00
if (Utils.isArray(oData.Result['Accounts']))
{
_.each(Data.accounts(), function (oAccount) {
aCounts[oAccount.email] = oAccount.count();
});
2014-10-04 19:58:01 +08:00
Utils.delegateRunOnDestroy(Data.accounts());
2014-08-21 23:08:34 +08:00
Data.accounts(_.map(oData.Result['Accounts'], function (sValue) {
return new AccountModel(sValue, sValue !== sParentEmail, aCounts[sValue] || 0);
2014-08-20 23:03:12 +08:00
}));
}
if (Utils.isUnd(bBoot) ? false : !!bBoot)
{
self.accountsCounts();
}
2014-08-20 23:03:12 +08:00
if (Utils.isArray(oData.Result['Identities']))
{
2014-10-04 19:58:01 +08:00
Utils.delegateRunOnDestroy(Data.identities());
2014-08-21 23:08:34 +08:00
Data.identities(_.map(oData.Result['Identities'], function (oIdentityData) {
2013-12-07 06:45:46 +08:00
2014-08-20 23:03:12 +08:00
var
sId = Utils.pString(oIdentityData['Id']),
sEmail = Utils.pString(oIdentityData['Email']),
oIdentity = new IdentityModel(sId, sEmail, sId !== sAccountEmail)
;
2013-12-07 06:45:46 +08:00
2014-08-20 23:03:12 +08:00
oIdentity.name(Utils.pString(oIdentityData['Name']));
oIdentity.replyTo(Utils.pString(oIdentityData['ReplyTo']));
oIdentity.bcc(Utils.pString(oIdentityData['Bcc']));
2013-12-07 06:45:46 +08:00
2014-08-20 23:03:12 +08:00
return oIdentity;
}));
}
}
2014-08-20 23:03:12 +08:00
});
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.quota = function ()
{
2014-08-22 23:08:56 +08:00
Remote.quota(function (sResult, oData) {
2014-08-20 23:03:12 +08:00
if (Enums.StorageResultType.Success === sResult && oData && oData.Result &&
Utils.isArray(oData.Result) && 1 < oData.Result.length &&
Utils.isPosNumeric(oData.Result[0], true) && Utils.isPosNumeric(oData.Result[1], true))
{
require('Stores/Quota').populateData(
Utils.pInt(oData.Result[1]), Utils.pInt(oData.Result[0]));
2014-08-20 23:03:12 +08:00
}
});
};
2014-08-20 23:03:12 +08:00
/**
* @param {string} sFolder
* @param {Array=} aList = []
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.folderInformation = function (sFolder, aList)
2014-08-20 23:03:12 +08:00
{
if ('' !== Utils.trim(sFolder))
{
2014-08-22 23:08:56 +08:00
var self = this;
Remote.folderInformation(function (sResult, oData) {
2014-08-20 23:03:12 +08:00
if (Enums.StorageResultType.Success === sResult)
{
if (oData && oData.Result && oData.Result.Hash && oData.Result.Folder)
{
var
2014-08-20 23:03:12 +08:00
iUtc = moment().unix(),
2014-08-21 23:08:34 +08:00
sHash = Cache.getFolderHash(oData.Result.Folder),
oFolder = Cache.getFolderFromCacheList(oData.Result.Folder),
2014-08-20 23:03:12 +08:00
bCheck = false,
sUid = '',
aList = [],
2014-08-20 23:03:12 +08:00
bUnreadCountChange = false,
oFlags = null
;
if (oFolder)
{
oFolder.interval = iUtc;
2014-08-20 23:03:12 +08:00
if (oData.Result.Hash)
{
2014-08-21 23:08:34 +08:00
Cache.setFolderHash(oData.Result.Folder, oData.Result.Hash);
}
2014-08-20 23:03:12 +08:00
if (Utils.isNormal(oData.Result.MessageCount))
{
2014-08-20 23:03:12 +08:00
oFolder.messageCountAll(oData.Result.MessageCount);
}
2014-08-20 23:03:12 +08:00
if (Utils.isNormal(oData.Result.MessageUnseenCount))
{
2014-08-20 23:03:12 +08:00
if (Utils.pInt(oFolder.messageCountUnread()) !== Utils.pInt(oData.Result.MessageUnseenCount))
{
bUnreadCountChange = true;
}
2014-08-20 23:03:12 +08:00
oFolder.messageCountUnread(oData.Result.MessageUnseenCount);
}
if (bUnreadCountChange)
{
2014-08-21 23:08:34 +08:00
Cache.clearMessageFlagsFromCacheByFolder(oFolder.fullNameRaw);
}
2014-08-20 23:03:12 +08:00
if (oData.Result.Flags)
{
for (sUid in oData.Result.Flags)
{
if (oData.Result.Flags.hasOwnProperty(sUid))
{
bCheck = true;
oFlags = oData.Result.Flags[sUid];
2014-08-21 23:08:34 +08:00
Cache.storeMessageFlagsToCacheByFolderAndUid(oFolder.fullNameRaw, sUid.toString(), [
2014-08-20 23:03:12 +08:00
!oFlags['IsSeen'], !!oFlags['IsFlagged'], !!oFlags['IsAnswered'], !!oFlags['IsForwarded'], !!oFlags['IsReadReceipt']
]);
}
}
if (bCheck)
{
2014-08-22 23:08:56 +08:00
self.reloadFlagsCurrentMessageListAndMessageFromCache();
2014-08-20 23:03:12 +08:00
}
}
2014-08-21 23:08:34 +08:00
Data.initUidNextAndNewMessages(oFolder.fullNameRaw, oData.Result.UidNext, oData.Result.NewMessages);
2014-08-20 23:03:12 +08:00
if (oData.Result.Hash !== sHash || '' === sHash)
{
2014-08-21 23:08:34 +08:00
if (oFolder.fullNameRaw === Data.currentFolderFullNameRaw())
{
2014-08-22 23:08:56 +08:00
self.reloadMessageList();
}
else if (Cache.getFolderInboxName() === oFolder.fullNameRaw)
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
self.recacheInboxMessageList();
2014-08-20 23:03:12 +08:00
}
}
else if (bUnreadCountChange)
{
2014-08-21 23:08:34 +08:00
if (oFolder.fullNameRaw === Data.currentFolderFullNameRaw())
{
2014-08-21 23:08:34 +08:00
aList = Data.messageList();
if (Utils.isNonEmptyArray(aList))
{
2014-08-22 23:08:56 +08:00
self.folderInformation(oFolder.fullNameRaw, aList);
}
}
}
}
}
}
2014-08-20 23:03:12 +08:00
}, sFolder, aList);
}
};
2014-08-20 23:03:12 +08:00
/**
* @param {boolean=} bBoot = false
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.folderInformationMultiply = function (bBoot)
{
2014-08-20 23:03:12 +08:00
bBoot = Utils.isUnd(bBoot) ? false : !!bBoot;
2014-08-20 23:03:12 +08:00
var
2014-08-22 23:08:56 +08:00
self = this,
2014-08-20 23:03:12 +08:00
iUtc = moment().unix(),
2014-08-21 23:08:34 +08:00
aFolders = Data.getNextFolderNames(bBoot)
2014-08-20 23:03:12 +08:00
;
2014-08-20 23:03:12 +08:00
if (Utils.isNonEmptyArray(aFolders))
{
2014-08-22 23:08:56 +08:00
Remote.folderInformationMultiply(function (sResult, oData) {
2014-08-20 23:03:12 +08:00
if (Enums.StorageResultType.Success === sResult)
{
if (oData && oData.Result && oData.Result.List && Utils.isNonEmptyArray(oData.Result.List))
{
_.each(oData.Result.List, function (oItem) {
2014-08-20 23:03:12 +08:00
var
aList = [],
2014-08-21 23:08:34 +08:00
sHash = Cache.getFolderHash(oItem.Folder),
oFolder = Cache.getFolderFromCacheList(oItem.Folder),
2014-08-20 23:03:12 +08:00
bUnreadCountChange = false
;
2014-08-20 23:03:12 +08:00
if (oFolder)
{
oFolder.interval = iUtc;
2014-08-20 23:03:12 +08:00
if (oItem.Hash)
{
2014-08-21 23:08:34 +08:00
Cache.setFolderHash(oItem.Folder, oItem.Hash);
2014-08-20 23:03:12 +08:00
}
2014-08-20 23:03:12 +08:00
if (Utils.isNormal(oItem.MessageCount))
{
oFolder.messageCountAll(oItem.MessageCount);
}
2014-08-20 23:03:12 +08:00
if (Utils.isNormal(oItem.MessageUnseenCount))
{
if (Utils.pInt(oFolder.messageCountUnread()) !== Utils.pInt(oItem.MessageUnseenCount))
{
bUnreadCountChange = true;
}
2014-08-20 23:03:12 +08:00
oFolder.messageCountUnread(oItem.MessageUnseenCount);
}
2014-08-20 23:03:12 +08:00
if (bUnreadCountChange)
{
2014-08-21 23:08:34 +08:00
Cache.clearMessageFlagsFromCacheByFolder(oFolder.fullNameRaw);
2014-08-20 23:03:12 +08:00
}
2014-08-20 23:03:12 +08:00
if (oItem.Hash !== sHash || '' === sHash)
{
2014-08-21 23:08:34 +08:00
if (oFolder.fullNameRaw === Data.currentFolderFullNameRaw())
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
self.reloadMessageList();
2014-08-20 23:03:12 +08:00
}
}
else if (bUnreadCountChange)
{
2014-08-21 23:08:34 +08:00
if (oFolder.fullNameRaw === Data.currentFolderFullNameRaw())
2014-08-20 23:03:12 +08:00
{
2014-08-21 23:08:34 +08:00
aList = Data.messageList();
2014-08-20 23:03:12 +08:00
if (Utils.isNonEmptyArray(aList))
{
2014-08-22 23:08:56 +08:00
self.folderInformation(oFolder.fullNameRaw, aList);
2014-08-20 23:03:12 +08:00
}
}
}
}
});
if (bBoot)
{ _.delay(function () {
self.folderInformationMultiply(true);
}, 2000);
2014-08-20 23:03:12 +08:00
}
}
}
}, aFolders);
}
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.setMessageSeen = function (oMessage)
2014-08-20 23:03:12 +08:00
{
if (oMessage.unseen())
{
2014-08-20 23:03:12 +08:00
oMessage.unseen(false);
2014-08-21 23:08:34 +08:00
var oFolder = Cache.getFolderFromCacheList(oMessage.folderFullNameRaw);
2014-08-20 23:03:12 +08:00
if (oFolder)
{
oFolder.messageCountUnread(0 <= oFolder.messageCountUnread() - 1 ?
oFolder.messageCountUnread() - 1 : 0);
}
2014-08-21 23:08:34 +08:00
Cache.storeMessageFlagsToCache(oMessage);
2014-08-22 23:08:56 +08:00
this.reloadFlagsCurrentMessageListAndMessageFromCache();
2014-08-20 23:03:12 +08:00
}
2014-08-21 23:08:34 +08:00
Remote.messageSetSeen(Utils.emptyFunction, oMessage.folderFullNameRaw, [oMessage.uid], true);
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.googleConnect = function ()
{
2014-10-06 02:37:31 +08:00
window.open(Links.socialGoogle(), 'Google', 'left=200,top=100,width=650,height=600,menubar=no,status=no,resizable=yes,scrollbars=yes');
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.twitterConnect = function ()
{
2014-10-06 02:37:31 +08:00
window.open(Links.socialTwitter(), 'Twitter', 'left=200,top=100,width=650,height=350,menubar=no,status=no,resizable=yes,scrollbars=yes');
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.facebookConnect = function ()
{
2014-10-06 02:37:31 +08:00
window.open(Links.socialFacebook(), 'Facebook', 'left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes');
2014-08-20 23:03:12 +08:00
};
2014-08-20 23:03:12 +08:00
/**
* @param {boolean=} bFireAllActions
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.socialUsers = function (bFireAllActions)
{
if (true === bFireAllActions)
{
SocialStore.google.loading(true);
SocialStore.facebook.loading(true);
SocialStore.twitter.loading(true);
2014-08-20 23:03:12 +08:00
}
2014-08-21 23:08:34 +08:00
Remote.socialUsers(function (sResult, oData) {
2014-08-20 23:03:12 +08:00
if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
2014-04-27 05:53:37 +08:00
{
SocialStore.google.userName(oData.Result['Google'] || '');
SocialStore.facebook.userName(oData.Result['Facebook'] || '');
SocialStore.twitter.userName(oData.Result['Twitter'] || '');
2014-04-27 05:53:37 +08:00
}
2014-08-20 23:03:12 +08:00
else
{
SocialStore.google.userName('');
SocialStore.facebook.userName('');
SocialStore.twitter.userName('');
2014-08-20 23:03:12 +08:00
}
SocialStore.google.loading(false);
SocialStore.facebook.loading(false);
SocialStore.twitter.loading(false);
2014-08-20 23:03:12 +08:00
});
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.googleDisconnect = function ()
2014-08-20 23:03:12 +08:00
{
SocialStore.google.loading(true);
2014-08-22 23:08:56 +08:00
Remote.googleDisconnect(this.socialUsers);
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.facebookDisconnect = function ()
2014-08-20 23:03:12 +08:00
{
SocialStore.facebook.loading(true);
2014-08-22 23:08:56 +08:00
Remote.facebookDisconnect(this.socialUsers);
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.twitterDisconnect = function ()
2014-08-20 23:03:12 +08:00
{
SocialStore.twitter.loading(true);
2014-08-22 23:08:56 +08:00
Remote.twitterDisconnect(this.socialUsers);
2014-08-20 23:03:12 +08:00
};
/**
2014-08-22 23:08:56 +08:00
* @param {string} sQuery
* @param {Function} fCallback
2014-08-20 23:03:12 +08:00
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.getAutocomplete = function (sQuery, fCallback)
2014-08-20 23:03:12 +08:00
{
var
2014-08-22 23:08:56 +08:00
aData = []
2014-08-20 23:03:12 +08:00
;
2014-08-22 23:08:56 +08:00
Remote.suggestions(function (sResult, oData) {
if (Enums.StorageResultType.Success === sResult && oData && Utils.isArray(oData.Result))
{
aData = _.map(oData.Result, function (aItem) {
return aItem && aItem[0] ? new EmailModel(aItem[0], aItem[1]) : null;
});
2014-08-20 23:03:12 +08:00
2014-08-22 23:08:56 +08:00
fCallback(_.compact(aData));
}
else if (Enums.StorageResultType.Abort !== sResult)
{
fCallback([]);
}
2014-04-27 05:53:37 +08:00
2014-08-22 23:08:56 +08:00
}, sQuery);
};
2014-08-20 23:03:12 +08:00
2014-10-18 21:43:44 +08:00
AppUser.prototype.setMessageList = function (oData, bCached)
2014-08-22 23:08:56 +08:00
{
if (oData && oData.Result && 'Collection/MessageCollection' === oData.Result['@Object'] &&
oData.Result['@Collection'] && Utils.isArray(oData.Result['@Collection']))
{
2014-08-22 23:08:56 +08:00
var
mLastCollapsedThreadUids = null,
iIndex = 0,
iLen = 0,
iCount = 0,
iOffset = 0,
aList = [],
iUtc = moment().unix(),
aStaticList = Data.staticMessageList,
oJsonMessage = null,
oMessage = null,
oFolder = null,
iNewCount = 0,
bUnreadCountChange = false
;
iCount = Utils.pInt(oData.Result.MessageResultCount);
iOffset = Utils.pInt(oData.Result.Offset);
if (Utils.isNonEmptyArray(oData.Result.LastCollapsedThreadUids))
{
mLastCollapsedThreadUids = oData.Result.LastCollapsedThreadUids;
}
oFolder = Cache.getFolderFromCacheList(
Utils.isNormal(oData.Result.Folder) ? oData.Result.Folder : '');
if (oFolder && !bCached)
{
2014-08-22 23:08:56 +08:00
oFolder.interval = iUtc;
Cache.setFolderHash(oData.Result.Folder, oData.Result.FolderHash);
if (Utils.isNormal(oData.Result.MessageCount))
{
2014-08-22 23:08:56 +08:00
oFolder.messageCountAll(oData.Result.MessageCount);
}
2014-08-20 23:03:12 +08:00
2014-08-22 23:08:56 +08:00
if (Utils.isNormal(oData.Result.MessageUnseenCount))
{
if (Utils.pInt(oFolder.messageCountUnread()) !== Utils.pInt(oData.Result.MessageUnseenCount))
{
bUnreadCountChange = true;
}
oFolder.messageCountUnread(oData.Result.MessageUnseenCount);
}
Data.initUidNextAndNewMessages(oFolder.fullNameRaw, oData.Result.UidNext, oData.Result.NewMessages);
}
2014-08-22 23:08:56 +08:00
if (bUnreadCountChange && oFolder)
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
Cache.clearMessageFlagsFromCacheByFolder(oFolder.fullNameRaw);
}
for (iIndex = 0, iLen = oData.Result['@Collection'].length; iIndex < iLen; iIndex++)
{
oJsonMessage = oData.Result['@Collection'][iIndex];
if (oJsonMessage && 'Object/Message' === oJsonMessage['@Object'])
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
oMessage = aStaticList[iIndex];
if (!oMessage || !oMessage.initByJson(oJsonMessage))
{
oMessage = MessageModel.newInstanceFromJson(oJsonMessage);
}
if (oMessage)
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
if (Cache.hasNewMessageAndRemoveFromCache(oMessage.folderFullNameRaw, oMessage.uid) && 5 >= iNewCount)
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
iNewCount++;
oMessage.newForAnimation(true);
2014-08-20 23:03:12 +08:00
}
2014-08-22 23:08:56 +08:00
oMessage.deleted(false);
if (bCached)
{
Cache.initMessageFlagsFromCache(oMessage);
}
else
{
Cache.storeMessageFlagsToCache(oMessage);
}
oMessage.lastInCollapsedThread(mLastCollapsedThreadUids && -1 < Utils.inArray(Utils.pInt(oMessage.uid), mLastCollapsedThreadUids) ? true : false);
aList.push(oMessage);
2014-08-20 23:03:12 +08:00
}
}
}
2014-08-22 23:08:56 +08:00
Data.messageListCount(iCount);
Data.messageListSearch(Utils.isNormal(oData.Result.Search) ? oData.Result.Search : '');
Data.messageListPage(window.Math.ceil((iOffset / UserSettingsStore.messagesPerPage()) + 1));
2014-08-22 23:08:56 +08:00
Data.messageListEndFolder(Utils.isNormal(oData.Result.Folder) ? oData.Result.Folder : '');
Data.messageListEndSearch(Utils.isNormal(oData.Result.Search) ? oData.Result.Search : '');
Data.messageListEndPage(Data.messageListPage());
Data.messageList(aList);
Data.messageListIsNotCompleted(false);
if (aStaticList.length < aList.length)
{
Data.staticMessageList = aList;
}
Cache.clearNewMessageCache();
if (oFolder && (bCached || bUnreadCountChange || Data.useThreads()))
{
this.folderInformation(oFolder.fullNameRaw, aList);
}
}
else
{
Data.messageListCount(0);
Data.messageList([]);
Data.messageListError(Translator.getNotification(
2014-08-22 23:08:56 +08:00
oData && oData.ErrorCode ? oData.ErrorCode : Enums.Notification.CantGetMessageList
));
}
};
/**
* @param {string} sNamespace
* @param {Array} aFolders
* @return {Array}
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.folderResponseParseRec = function (sNamespace, aFolders)
2014-08-22 23:08:56 +08:00
{
var
2014-08-25 15:10:51 +08:00
self = this,
2014-08-22 23:08:56 +08:00
iIndex = 0,
iLen = 0,
oFolder = null,
oCacheFolder = null,
sFolderFullNameRaw = '',
aSubFolders = [],
aList = []
;
for (iIndex = 0, iLen = aFolders.length; iIndex < iLen; iIndex++)
{
oFolder = aFolders[iIndex];
if (oFolder)
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
sFolderFullNameRaw = oFolder.FullNameRaw;
oCacheFolder = Cache.getFolderFromCacheList(sFolderFullNameRaw);
if (!oCacheFolder)
{
oCacheFolder = FolderModel.newInstanceFromJson(oFolder);
if (oCacheFolder)
{
Cache.setFolderToCacheList(sFolderFullNameRaw, oCacheFolder);
Cache.setFolderFullNameRaw(oCacheFolder.fullNameHash, sFolderFullNameRaw, oCacheFolder);
2014-08-22 23:08:56 +08:00
}
}
if (oCacheFolder)
{
2014-08-25 15:10:51 +08:00
oCacheFolder.collapsed(!self.isFolderExpanded(oCacheFolder.fullNameHash));
2014-08-22 23:08:56 +08:00
if (oFolder.Extended)
{
if (oFolder.Extended.Hash)
{
Cache.setFolderHash(oCacheFolder.fullNameRaw, oFolder.Extended.Hash);
}
if (Utils.isNormal(oFolder.Extended.MessageCount))
{
oCacheFolder.messageCountAll(oFolder.Extended.MessageCount);
}
if (Utils.isNormal(oFolder.Extended.MessageUnseenCount))
{
oCacheFolder.messageCountUnread(oFolder.Extended.MessageUnseenCount);
}
}
aSubFolders = oFolder['SubFolders'];
if (aSubFolders && 'Collection/FolderCollection' === aSubFolders['@Object'] &&
aSubFolders['@Collection'] && Utils.isArray(aSubFolders['@Collection']))
{
oCacheFolder.subFolders(
this.folderResponseParseRec(sNamespace, aSubFolders['@Collection']));
}
aList.push(oCacheFolder);
}
2014-08-20 23:03:12 +08:00
}
}
2014-08-22 23:08:56 +08:00
return aList;
2014-08-20 23:03:12 +08:00
};
2014-08-12 21:51:34 +08:00
2014-08-20 23:03:12 +08:00
/**
2014-08-22 23:08:56 +08:00
* @param {*} oData
2014-08-20 23:03:12 +08:00
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.setFolders = function (oData)
2014-08-20 23:03:12 +08:00
{
2014-08-12 21:51:34 +08:00
var
2014-08-22 23:08:56 +08:00
aList = [],
bUpdate = false,
fNormalizeFolder = function (sFolderFullNameRaw) {
return ('' === sFolderFullNameRaw || Consts.Values.UnuseOptionValue === sFolderFullNameRaw ||
null !== Cache.getFolderFromCacheList(sFolderFullNameRaw)) ? sFolderFullNameRaw : '';
}
2014-08-12 21:51:34 +08:00
;
2014-08-22 23:08:56 +08:00
if (oData && oData.Result && 'Collection/FolderCollection' === oData.Result['@Object'] &&
oData.Result['@Collection'] && Utils.isArray(oData.Result['@Collection']))
{
if (!Utils.isUnd(oData.Result.Namespace))
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
Data.namespace = oData.Result.Namespace;
}
2013-12-10 23:13:10 +08:00
2014-08-27 23:59:44 +08:00
Data.threading(!!Settings.settingsGet('UseImapThread') && oData.Result.IsThreadsSupported && true);
2014-08-22 23:08:56 +08:00
aList = this.folderResponseParseRec(Data.namespace, oData.Result['@Collection']);
Data.folderList(aList);
if (oData.Result['SystemFolders'] &&
2014-08-27 23:59:44 +08:00
'' === '' + Settings.settingsGet('SentFolder') + Settings.settingsGet('DraftFolder') +
Settings.settingsGet('SpamFolder') + Settings.settingsGet('TrashFolder') + Settings.settingsGet('ArchiveFolder') +
Settings.settingsGet('NullFolder'))
2014-08-22 23:08:56 +08:00
{
// TODO Magic Numbers
2014-08-27 23:59:44 +08:00
Settings.settingsSet('SentFolder', oData.Result['SystemFolders'][2] || null);
Settings.settingsSet('DraftFolder', oData.Result['SystemFolders'][3] || null);
Settings.settingsSet('SpamFolder', oData.Result['SystemFolders'][4] || null);
Settings.settingsSet('TrashFolder', oData.Result['SystemFolders'][5] || null);
Settings.settingsSet('ArchiveFolder', oData.Result['SystemFolders'][12] || null);
2014-08-22 23:08:56 +08:00
bUpdate = true;
2014-08-20 23:03:12 +08:00
}
2014-08-22 23:08:56 +08:00
2014-08-27 23:59:44 +08:00
Data.sentFolder(fNormalizeFolder(Settings.settingsGet('SentFolder')));
Data.draftFolder(fNormalizeFolder(Settings.settingsGet('DraftFolder')));
Data.spamFolder(fNormalizeFolder(Settings.settingsGet('SpamFolder')));
Data.trashFolder(fNormalizeFolder(Settings.settingsGet('TrashFolder')));
Data.archiveFolder(fNormalizeFolder(Settings.settingsGet('ArchiveFolder')));
2014-08-22 23:08:56 +08:00
if (bUpdate)
2014-08-20 23:03:12 +08:00
{
2014-08-22 23:08:56 +08:00
Remote.saveSystemFolders(Utils.emptyFunction, {
'SentFolder': Data.sentFolder(),
'DraftFolder': Data.draftFolder(),
'SpamFolder': Data.spamFolder(),
'TrashFolder': Data.trashFolder(),
'ArchiveFolder': Data.archiveFolder(),
'NullFolder': 'NullFolder'
});
2014-08-20 23:03:12 +08:00
}
2014-08-12 21:51:34 +08:00
2014-09-02 19:34:17 +08:00
Local.set(Enums.ClientSideKeyName.FoldersLashHash, oData.Result.FoldersHash);
2014-08-22 23:08:56 +08:00
}
2014-08-20 23:03:12 +08:00
};
2013-12-10 23:13:10 +08:00
2014-08-20 23:03:12 +08:00
/**
2014-08-22 23:08:56 +08:00
* @param {string} sFullNameHash
* @return {boolean}
2014-08-20 23:03:12 +08:00
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.isFolderExpanded = function (sFullNameHash)
2014-08-20 23:03:12 +08:00
{
2014-09-02 19:34:17 +08:00
var aExpandedList = Local.get(Enums.ClientSideKeyName.ExpandedFolders);
return Utils.isArray(aExpandedList) && -1 !== _.indexOf(aExpandedList, sFullNameHash);
2014-08-22 23:08:56 +08:00
};
/**
* @param {string} sFullNameHash
* @param {boolean} bExpanded
*/
2014-10-18 21:43:44 +08:00
AppUser.prototype.setExpandedFolder = function (sFullNameHash, bExpanded)
2014-08-22 23:08:56 +08:00
{
2014-09-02 19:34:17 +08:00
var aExpandedList = Local.get(Enums.ClientSideKeyName.ExpandedFolders);
if (!Utils.isArray(aExpandedList))
2014-08-22 23:08:56 +08:00
{
aExpandedList = [];
}
if (bExpanded)
{
aExpandedList.push(sFullNameHash);
aExpandedList = _.uniq(aExpandedList);
}
else
{
aExpandedList = _.without(aExpandedList, sFullNameHash);
}
2014-09-02 19:34:17 +08:00
Local.set(Enums.ClientSideKeyName.ExpandedFolders, aExpandedList);
2014-08-22 23:08:56 +08:00
};
2015-01-09 07:31:31 +08:00
AppUser.prototype.initHorizontalLayoutResizer = function (sClientSideKeyName)
{
var
iMinHeight = 200,
iMaxHeight = 500,
oTop = null,
oBottom = null,
fResizeFunction = function (oEvent, oObject) {
if (oObject && oObject.size && oObject.size.height)
{
Local.set(sClientSideKeyName, oObject.size.height);
fSetHeight(oObject.size.height);
Utils.windowResize();
}
},
oOptions = {
'helper': 'ui-resizable-helper-h',
'minHeight': iMinHeight,
'maxHeight': iMaxHeight,
'handles': 's',
'stop': fResizeFunction
},
fSetHeight = function (iHeight) {
if (iHeight)
{
if (oTop)
{
oTop.attr('style', 'height:' + iHeight + 'px');
}
if (oBottom)
{
oBottom.attr('style', 'top:' + (55 /* top toolbar */ + iHeight) + 'px');
}
}
},
fDisable = function (bDisable) {
if (bDisable)
{
if (oTop && oTop.hasClass('ui-resizable'))
{
oTop
.resizable('destroy')
.removeAttr('style')
;
}
if (oBottom)
{
oBottom.removeAttr('style');
}
}
else if (Globals.$html.hasClass('rl-bottom-preview-pane'))
{
oTop = $('.b-message-list-wrapper');
oBottom = $('.b-message-view-wrapper');
if (!oTop.hasClass('ui-resizable'))
{
oTop.resizable(oOptions);
}
var iHeight = Utils.pInt(Local.get(sClientSideKeyName)) || 300;
fSetHeight(iHeight > iMinHeight ? iHeight : iMinHeight);
}
}
;
fDisable(false);
Events.sub('layout', function (sLayout) {
fDisable(Enums.Layout.BottomPreview !== sLayout);
});
};
AppUser.prototype.initVerticalLayoutResizer = function (sClientSideKeyName)
2014-08-22 23:08:56 +08:00
{
var
iDisabledWidth = 60,
iMinWidth = 155,
2015-01-09 07:31:31 +08:00
oLeft = $('#rl-left'),
oRight = $('#rl-right'),
2014-08-22 23:08:56 +08:00
2014-09-02 19:34:17 +08:00
mLeftWidth = Local.get(sClientSideKeyName) || null,
2014-08-22 23:08:56 +08:00
fSetWidth = function (iWidth) {
if (iWidth)
{
oLeft.css({
'width': '' + iWidth + 'px'
});
oRight.css({
'left': '' + iWidth + 'px'
});
}
},
fDisable = function (bDisable) {
if (bDisable)
{
oLeft.resizable('disable');
fSetWidth(iDisabledWidth);
}
else
{
oLeft.resizable('enable');
2014-09-02 19:34:17 +08:00
var iWidth = Utils.pInt(Local.get(sClientSideKeyName)) || iMinWidth;
2014-08-22 23:08:56 +08:00
fSetWidth(iWidth > iMinWidth ? iWidth : iMinWidth);
}
},
fResizeFunction = function (oEvent, oObject) {
if (oObject && oObject.size && oObject.size.width)
{
2014-09-02 19:34:17 +08:00
Local.set(sClientSideKeyName, oObject.size.width);
2014-08-22 23:08:56 +08:00
oRight.css({
'left': '' + oObject.size.width + 'px'
});
}
}
;
if (null !== mLeftWidth)
{
fSetWidth(mLeftWidth > iMinWidth ? mLeftWidth : iMinWidth);
}
oLeft.resizable({
2015-01-09 07:31:31 +08:00
'helper': 'ui-resizable-helper-w',
2014-08-22 23:08:56 +08:00
'minWidth': iMinWidth,
'maxWidth': 350,
'handles': 'e',
'stop': fResizeFunction
});
Events.sub('left-panel.off', function () {
fDisable(true);
});
Events.sub('left-panel.on', function () {
fDisable(false);
});
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.bootstartLoginScreen = function ()
2014-08-27 23:59:44 +08:00
{
var sCustomLoginLink = Utils.pString(Settings.settingsGet('CustomLoginLink'));
if (!sCustomLoginLink)
{
kn.hideLoading();
kn.startScreens([
2014-10-18 21:43:44 +08:00
require('Screen/User/Login')
2014-08-27 23:59:44 +08:00
]);
Plugins.runHook('rl-start-login-screens');
Events.pub('rl.bootstart-login-screens');
}
else
{
kn.routeOff();
2014-10-06 02:37:31 +08:00
kn.setHash(Links.root(), true);
2014-08-27 23:59:44 +08:00
kn.routeOff();
_.defer(function () {
window.location.href = sCustomLoginLink;
});
}
};
2014-10-18 21:43:44 +08:00
AppUser.prototype.bootstart = function ()
{
2014-08-20 23:03:12 +08:00
AbstractApp.prototype.bootstart.call(this);
2014-08-21 23:08:34 +08:00
Data.populateDataOnStart();
2014-08-20 23:03:12 +08:00
var
2014-08-22 23:08:56 +08:00
self = this,
2014-09-19 23:24:38 +08:00
$LAB = require('$LAB'),
2014-08-27 23:59:44 +08:00
sJsHash = Settings.settingsGet('JsHash'),
iContactsSyncInterval = Utils.pInt(Settings.settingsGet('ContactsSyncInterval')),
bGoogle = Settings.settingsGet('AllowGoogleSocial'),
bFacebook = Settings.settingsGet('AllowFacebookSocial'),
bTwitter = Settings.settingsGet('AllowTwitterSocial')
2014-08-20 23:03:12 +08:00
;
2014-09-19 23:24:38 +08:00
if (SimplePace)
2014-08-20 23:03:12 +08:00
{
2014-09-19 23:24:38 +08:00
SimplePace.set(70);
SimplePace.sleep();
2014-08-20 23:03:12 +08:00
}
2014-08-22 23:08:56 +08:00
Globals.leftPanelDisabled.subscribe(function (bValue) {
Events.pub('left-panel.' + (bValue ? 'off' : 'on'));
});
2014-08-27 23:59:44 +08:00
if (!!Settings.settingsGet('Auth'))
2014-08-20 23:03:12 +08:00
{
this.setTitle(Translator.i18n('TITLES/LOADING'));
2014-08-20 23:03:12 +08:00
//require.ensure([], function() { // require code splitting
self.folders(_.bind(function (bValue) {
2014-01-28 05:34:54 +08:00
kn.hideLoading();
if (bValue)
{
2014-09-19 23:24:38 +08:00
if ($LAB && window.crypto && window.crypto.getRandomValues && Settings.capa(Enums.Capa.OpenPGP))
{
var fOpenpgpCallback = function (openpgp) {
Data.openpgp = openpgp;
Data.openpgpKeyring = new openpgp.Keyring();
Data.capaOpenPGP(true);
Events.pub('openpgp.init');
self.reloadOpenPgpKeys();
};
if (window.openpgp)
{
fOpenpgpCallback(window.openpgp);
}
else
{
$LAB.script(Links.openPgpJs()).wait(function () {
if (window.openpgp)
{
fOpenpgpCallback(window.openpgp);
}
});
}
}
else
{
Data.capaOpenPGP(false);
}
kn.startScreens([
2014-10-18 21:43:44 +08:00
require('Screen/User/MailBox'),
require('Screen/User/Settings'),
require('Screen/User/About')
]);
if (bGoogle || bFacebook || bTwitter)
{
self.socialUsers(true);
}
Events.sub('interval.2m', function () {
self.folderInformation(Cache.getFolderInboxName());
});
Events.sub('interval.3m', function () {
var sF = Data.currentFolderFullNameRaw();
if (Cache.getFolderInboxName() !== sF)
2014-08-20 23:03:12 +08:00
{
self.folderInformation(sF);
2014-08-20 23:03:12 +08:00
}
});
Events.sub('interval.5m-after5m', function () {
self.folderInformationMultiply();
});
Events.sub('interval.15m', function () {
self.quota();
});
Events.sub('interval.20m', function () {
self.folders();
});
2014-08-20 23:03:12 +08:00
iContactsSyncInterval = 5 <= iContactsSyncInterval ? iContactsSyncInterval : 20;
iContactsSyncInterval = 320 >= iContactsSyncInterval ? iContactsSyncInterval : 320;
2014-10-29 06:05:50 +08:00
_.delay(function () {
self.contactsSync();
}, 10000);
_.delay(function () {
self.folderInformationMultiply(true);
}, 2000);
window.setInterval(function () {
self.contactsSync();
}, iContactsSyncInterval * 60000 + 5000);
2014-10-29 06:05:50 +08:00
if (Settings.capa(Enums.Capa.AdditionalAccounts) || Settings.capa(Enums.Capa.AdditionalIdentities))
{
self.accountsAndIdentities(true);
2014-10-29 06:05:50 +08:00
}
_.delay(function () {
2014-10-29 06:05:50 +08:00
var sF = Data.currentFolderFullNameRaw();
if (Cache.getFolderInboxName() !== sF)
{
self.folderInformation(sF);
}
}, 1000);
_.delay(function () {
self.quota();
}, 5000);
2014-08-20 23:03:12 +08:00
_.delay(function () {
2014-10-29 06:05:50 +08:00
Remote.appDelayStart(Utils.emptyFunction);
}, 35000);
2014-08-20 23:03:12 +08:00
Plugins.runHook('rl-start-user-screens');
Events.pub('rl.bootstart-user-screens');
2014-08-20 23:03:12 +08:00
if (!!Settings.settingsGet('AccountSignMe') && window.navigator.registerProtocolHandler)
{
2014-09-05 06:49:03 +08:00
_.delay(function () {
try {
window.navigator.registerProtocolHandler('mailto',
window.location.protocol + '//' + window.location.host + window.location.pathname + '?mailto&to=%s',
'' + (Settings.settingsGet('Title') || 'RainLoop'));
} catch(e) {}
2014-09-05 06:49:03 +08:00
if (Settings.settingsGet('MailToEmail'))
{
Utils.mailToHelper(Settings.settingsGet('MailToEmail'), require('View/Popup/Compose'));
}
}, 500);
}
2014-08-20 23:03:12 +08:00
if (!Globals.bMobileDevice)
{
_.defer(function () {
2015-01-09 07:31:31 +08:00
self.initVerticalLayoutResizer(Enums.ClientSideKeyName.FolderListSize);
});
}
}
else
{
this.bootstartLoginScreen();
}
2014-08-20 23:03:12 +08:00
2014-09-19 23:24:38 +08:00
if (SimplePace)
{
2014-09-19 23:24:38 +08:00
SimplePace.set(100);
}
}, self));
//}); // require code splitting
2014-08-20 23:03:12 +08:00
}
else
{
2014-08-27 23:59:44 +08:00
this.bootstartLoginScreen();
2014-09-19 23:24:38 +08:00
if (SimplePace)
2014-01-03 21:32:25 +08:00
{
2014-09-19 23:24:38 +08:00
SimplePace.set(100);
2014-01-03 21:32:25 +08:00
}
2014-08-20 23:03:12 +08:00
}
2014-08-20 23:03:12 +08:00
if (bGoogle)
{
2014-08-20 23:03:12 +08:00
window['rl_' + sJsHash + '_google_service'] = function () {
SocialStore.google.loading(true);
2014-08-22 23:08:56 +08:00
self.socialUsers();
2014-08-20 23:03:12 +08:00
};
}
2014-08-20 23:03:12 +08:00
if (bFacebook)
{
window['rl_' + sJsHash + '_facebook_service'] = function () {
SocialStore.facebook.loading(true);
2014-08-22 23:08:56 +08:00
self.socialUsers();
2014-08-20 23:03:12 +08:00
};
}
2014-08-20 23:03:12 +08:00
if (bTwitter)
{
window['rl_' + sJsHash + '_twitter_service'] = function () {
SocialStore.twitter.loading(true);
2014-08-22 23:08:56 +08:00
self.socialUsers();
2014-08-20 23:03:12 +08:00
};
}
2014-08-22 23:08:56 +08:00
Events.sub('interval.1m', function () {
2014-08-20 23:03:12 +08:00
Globals.momentTrigger(!Globals.momentTrigger());
});
2014-08-20 23:03:12 +08:00
Plugins.runHook('rl-start-screens');
2014-08-22 23:08:56 +08:00
Events.pub('rl.bootstart-end');
2014-08-20 23:03:12 +08:00
};
2014-10-18 21:43:44 +08:00
module.exports = new AppUser();
2014-09-05 06:49:03 +08:00
}());