!import
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1 //@line 47 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/base/content/mailWindowOverlay.js"
2
3 const MSG_FLAG_READ = 0x000001;
4 const MSG_FLAG_HAS_RE = 0x000010;
5 const MSG_FLAG_IMAP_DELETED = 0x200000;
6 const ADDR_DB_LARGE_COMMIT = 1;
7
8 const kClassicMailLayout = 0;
9 const kWideMailLayout = 1;
10 const kVerticalMailLayout = 2;
11
12 // Per message header flags to keep track of whether the user is allowing remote
13 // content for a particular message.
14 // if you change or add more values to these constants, be sure to modify
15 // the corresponding definitions in nsMsgContentPolicy.cpp
16 const kNoRemoteContentPolicy = 0;
17 const kBlockRemoteContent = 1;
18 const kAllowRemoteContent = 2;
19
20 const kMsgNotificationPhishingBar = 1;
21 const kMsgNotificationJunkBar = 2;
22 const kMsgNotificationRemoteImages = 3;
23
24 var gMessengerBundle;
25 var gPrefBranch = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch(null);
26 var gPrintSettings = null;
27 var gMarkViewedMessageAsReadTimer = null; // if the user has configured the app to mark a message as read if it is viewed for more than n seconds
28
29 // the user preference,
30 // if HTML is not allowed. I assume, that the user could have set this to a
31 // value > 1 in his prefs.js or user.js, but that the value will not
32 // change during runtime other than through the MsgBody*() functions below.
33 var gDisallow_classes_no_html = 1;
34
35 // Disable the new account menu item if the account preference is locked.
36 // Two other affected areas are the account central and the account manager
37 // dialog.
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
38 function menu_new_init()
39 {
40 if (!gMessengerBundle)
41 gMessengerBundle = document.getElementById("bundle_messenger");
42
43 var newAccountItem = document.getElementById('newAccountMenuItem');
44 if (gPrefBranch.prefIsLocked("mail.disable_new_account_addition"))
45 newAccountItem.setAttribute("disabled","true");
46
47 // Change "New Folder..." menu according to the context
48 var folderArray = GetSelectedMsgFolders();
49 if (folderArray.length == 0)
50 return;
51 var msgFolder = folderArray[0];
52 var isServer = msgFolder.isServer;
53 var serverType = msgFolder.server.type;
54 var canCreateNew = msgFolder.canCreateSubfolders;
55 var isInbox = IsSpecialFolder(msgFolder, MSG_FOLDER_FLAG_INBOX, false);
56 var isIMAPFolder = serverType == "imap";
57 var ioService = Components.classes["@mozilla.org/network/io-service;1"]
58 .getService(Components.interfaces.nsIIOService);
59 var showNew = ((serverType != 'nntp') && canCreateNew) || isInbox;
60 ShowMenuItem("menu_newFolder", showNew);
61 ShowMenuItem("menu_newVirtualFolder", showNew);
62
63 EnableMenuItem("menu_newFolder", !isIMAPFolder || MailOfflineMgr.isOnline());
64 EnableMenuItem("menu_newVirtualFolder", true);
65 if (showNew)
66 SetMenuItemLabel("menu_newFolder", gMessengerBundle.getString((isServer || isInbox) ? "newFolderMenuItem" : "newSubfolderMenuItem"));
67 }
68
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
69 function goUpdateMailMenuItems(commandset)
70 {
71 // dump("Updating commands for " + commandset.id + "\n");
72
73 for (var i = 0; i < commandset.childNodes.length; i++)
74 {
75 var commandID = commandset.childNodes[i].getAttribute("id");
76 if (commandID)
77 {
78 goUpdateCommand(commandID);
79 }
80 }
81 }
82
file_init
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
83 function file_init()
84 {
85 document.commandDispatcher.updateCommands('create-menu-file');
86 }
87
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
88 function InitEditMessagesMenu()
89 {
90 goSetMenuValue('cmd_delete', 'valueDefault');
91 goSetAccessKey('cmd_delete', 'valueDefaultAccessKey');
92 document.commandDispatcher.updateCommands('create-menu-edit');
93
94 // initialize the favorite Folder checkbox in the edit menu
95 var favoriteFolderMenu = document.getElementById('menu_favoriteFolder');
96 if (favoriteFolderMenu && !favoriteFolderMenu.disabled)
97 {
98 var folderTree = GetFolderTree();
99 var startIndex = {};
100 var endIndex = {};
101 folderTree.view.selection.getRangeAt(0, startIndex, endIndex);
102 if (startIndex.value >= 0)
103 {
104 var numSelected = endIndex.value - startIndex.value + 1;
105 var folderResource = GetFolderResource(folderTree, startIndex.value);
106 var isServer = GetFolderAttribute(folderTree, folderResource, "IsServer") == 'true';
107 SetupFavoritesMenuItem(folderResource, numSelected, isServer, 'menu_favoriteFolder');
108 }
109 }
110 }
111
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
112 function InitGoMessagesMenu()
113 {
114 document.commandDispatcher.updateCommands('create-menu-go');
115 }
116
view_init
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
117 function view_init()
118 {
119 if (!gMessengerBundle)
120 gMessengerBundle = document.getElementById("bundle_messenger");
121 var message_menuitem=document.getElementById('menu_showMessage');
122
123 if (message_menuitem)
124 {
125 var message_menuitem_hidden = message_menuitem.getAttribute("hidden");
126 if(message_menuitem_hidden != "true"){
127 message_menuitem.setAttribute('checked', !IsMessagePaneCollapsed());
128 message_menuitem.setAttribute('disabled', gAccountCentralLoaded);
129 }
130 }
131
132 // Disable some menus if account manager is showing
133 var sort_menuitem = document.getElementById('viewSortMenu');
134 if (sort_menuitem) {
135 sort_menuitem.setAttribute("disabled", gAccountCentralLoaded);
136 }
137 var view_menuitem = document.getElementById('viewMessageViewMenu');
138 if (view_menuitem) {
139 view_menuitem.setAttribute("disabled", gAccountCentralLoaded);
140 }
141 var threads_menuitem = document.getElementById('viewMessagesMenu');
142 if (threads_menuitem) {
143 threads_menuitem.setAttribute("disabled", gAccountCentralLoaded);
144 }
145
146 // hide the views menu item if the user doesn't have the views toolbar button visible
147 var viewsToolbarButton = document.getElementById("mailviews-container");
148 document.getElementById('viewMessageViewMenu').hidden = !viewsToolbarButton;
149
150 // Initialize the View Attachment Inline menu
151 var viewAttachmentInline = pref.getBoolPref("mail.inline_attachments");
152 document.getElementById("viewAttachmentsInlineMenuitem").setAttribute("checked", viewAttachmentInline ? "true" : "false");
153
154 document.commandDispatcher.updateCommands('create-menu-view');
155 }
156
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
157 function InitViewLayoutStyleMenu(event)
158 {
159 var paneConfig = pref.getIntPref("mail.pane_config.dynamic");
160 var layoutStyleMenuitem = event.target.childNodes[paneConfig];
161 if (layoutStyleMenuitem)
162 layoutStyleMenuitem.setAttribute("checked", "true");
163 }
164
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
165 function InitViewFolderViewsMenu(event)
166 {
167 var layoutStyleMenuitem = event.target.childNodes[gCurrentFolderView];
168 if (layoutStyleMenuitem)
169 layoutStyleMenuitem.setAttribute("checked", "true");
170 }
171
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
172 function setSortByMenuItemCheckState(id, value)
173 {
174 var menuitem = document.getElementById(id);
175 if (menuitem)
176 menuitem.setAttribute("checked", value);
177 }
178
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
179 function InitViewSortByMenu()
180 {
181 var sortType = gDBView.sortType;
182
183 setSortByMenuItemCheckState("sortByDateMenuitem", (sortType == nsMsgViewSortType.byDate));
184 setSortByMenuItemCheckState("sortByReceivedMenuitem", (sortType == nsMsgViewSortType.byReceived));
185 setSortByMenuItemCheckState("sortByFlagMenuitem", (sortType == nsMsgViewSortType.byFlagged));
186 setSortByMenuItemCheckState("sortByOrderReceivedMenuitem", (sortType == nsMsgViewSortType.byId));
187 setSortByMenuItemCheckState("sortByPriorityMenuitem", (sortType == nsMsgViewSortType.byPriority));
188 setSortByMenuItemCheckState("sortBySizeMenuitem", (sortType == nsMsgViewSortType.bySize));
189 setSortByMenuItemCheckState("sortByStatusMenuitem", (sortType == nsMsgViewSortType.byStatus));
190 setSortByMenuItemCheckState("sortBySubjectMenuitem", (sortType == nsMsgViewSortType.bySubject));
191 setSortByMenuItemCheckState("sortByUnreadMenuitem", (sortType == nsMsgViewSortType.byUnread));
192 setSortByMenuItemCheckState("sortByTagsMenuitem", (sortType == nsMsgViewSortType.byTags));
193 setSortByMenuItemCheckState("sortByJunkStatusMenuitem", (sortType == nsMsgViewSortType.byJunkStatus));
194 setSortByMenuItemCheckState("sortByFromMenuitem", (sortType == nsMsgViewSortType.byAuthor));
195 setSortByMenuItemCheckState("sortByRecipientMenuitem", (sortType == nsMsgViewSortType.byRecipient));
196 setSortByMenuItemCheckState("sortByAttachmentsMenuitem", (sortType == nsMsgViewSortType.byAttachments));
197
198 var sortOrder = gDBView.sortOrder;
199 var sortTypeSupportsGrouping = (sortType == nsMsgViewSortType.byAuthor
200 || sortType == nsMsgViewSortType.byDate || sortType == nsMsgViewSortType.byReceived || sortType == nsMsgViewSortType.byPriority
201 || sortType == nsMsgViewSortType.bySubject || sortType == nsMsgViewSortType.byTags
202 || sortType == nsMsgViewSortType.byRecipient || sortType == nsMsgViewSortType.byAccount
203 || sortType == nsMsgViewSortType.byStatus || sortType == nsMsgViewSortType.byFlagged
204 || sortType == nsMsgViewSortType.byAttachments);
205
206 setSortByMenuItemCheckState("sortAscending", (sortOrder == nsMsgViewSortOrder.ascending));
207 setSortByMenuItemCheckState("sortDescending", (sortOrder == nsMsgViewSortOrder.descending));
208
209 var grouped = ((gDBView.viewFlags & nsMsgViewFlagsType.kGroupBySort) != 0);
210 var threaded = ((gDBView.viewFlags & nsMsgViewFlagsType.kThreadedDisplay) != 0 && !grouped);
211 var sortThreadedMenuItem = document.getElementById("sortThreaded");
212 var sortUnthreadedMenuItem = document.getElementById("sortUnthreaded");
213
214 sortThreadedMenuItem.setAttribute("checked", threaded);
215 sortUnthreadedMenuItem.setAttribute("checked", !threaded && !grouped);
216
217 sortThreadedMenuItem.setAttribute("disabled", !gDBView.supportsThreading);
218 sortUnthreadedMenuItem.setAttribute("disabled", !gDBView.supportsThreading);
219
220 var groupBySortOrderMenuItem = document.getElementById("groupBySort");
221
222 groupBySortOrderMenuItem.setAttribute("disabled", !gDBView.supportsThreading || !sortTypeSupportsGrouping);
223 groupBySortOrderMenuItem.setAttribute("checked", grouped);
224 }
225
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
226 function InitViewMessagesMenu()
227 {
228 var viewFlags = (gDBView) ? gDBView.viewFlags : 0;
229 var viewType = (gDBView) ? gDBView.viewType : 0;
230
231 var allMenuItem = document.getElementById("viewAllMessagesMenuItem");
232 if(allMenuItem)
233 allMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) == 0 && (viewType == nsMsgViewType.eShowAllThreads));
234
235 var unreadMenuItem = document.getElementById("viewUnreadMessagesMenuItem");
236 if(unreadMenuItem)
237 unreadMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) != 0);
238
239 var theadsWithUnreadMenuItem = document.getElementById("viewThreadsWithUnreadMenuItem");
240 if(theadsWithUnreadMenuItem)
241 theadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowThreadsWithUnread);
242
243 var watchedTheadsWithUnreadMenuItem = document.getElementById("viewWatchedThreadsWithUnreadMenuItem");
244 if(watchedTheadsWithUnreadMenuItem)
245 watchedTheadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowWatchedThreadsWithUnread);
246
247 var ignoredTheadsMenuItem = document.getElementById("viewIgnoredThreadsMenuItem");
248 if(ignoredTheadsMenuItem)
249 ignoredTheadsMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kShowIgnored) != 0);
250 }
251
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
252 function InitMessageMenu()
253 {
254 var aMessage = GetFirstSelectedMessage();
255 var isNews = false;
256 if(aMessage)
257 isNews = IsNewsMessage(aMessage);
258
259 //We show reply to Newsgroups only for news messages.
260 var replyNewsgroupMenuItem = document.getElementById("replyNewsgroupMainMenu");
261 if(replyNewsgroupMenuItem)
262 replyNewsgroupMenuItem.setAttribute("hidden", isNews ? "" : "true");
263
264 //For mail messages we say reply. For news we say ReplyToSender.
265 var replyMenuItem = document.getElementById("replyMainMenu");
266 if(replyMenuItem)
267 replyMenuItem.setAttribute("hidden", !isNews ? "" : "true");
268
269 var replySenderMenuItem = document.getElementById("replySenderMainMenu");
270 if(replySenderMenuItem)
271 replySenderMenuItem.setAttribute("hidden", isNews ? "" : "true");
272
273 // we only kill and watch threads for news
274 var threadMenuSeparator = document.getElementById("threadItemsSeparator");
275 if (threadMenuSeparator)
276 threadMenuSeparator.setAttribute("hidden", isNews ? "" : "true");
277 var killThreadMenuItem = document.getElementById("killThread");
278 if (killThreadMenuItem)
279 killThreadMenuItem.setAttribute("hidden", isNews ? "" : "true");
280 var watchThreadMenuItem = document.getElementById("watchThread");
281 if (watchThreadMenuItem)
282 watchThreadMenuItem.setAttribute("hidden", isNews ? "" : "true");
283
284 // disable the move and copy menus if there are no messages selected.
285 // disable the move menu if we can't delete msgs from the folder
286 var moveMenu = document.getElementById("moveMenu");
287 var msgFolder = GetLoadedMsgFolder();
288 if(moveMenu)
289 {
290 var enableMenuItem = aMessage && msgFolder && msgFolder.canDeleteMessages;
291 moveMenu.setAttribute("disabled", !enableMenuItem);
292 }
293
294 var copyMenu = document.getElementById("copyMenu");
295 if(copyMenu)
296 copyMenu.setAttribute("disabled", !aMessage);
297
298 initMoveToFolderAgainMenu(document.getElementById("moveToFolderAgain"));
299
300 // Disable Forward as/Label menu items if no message is selected
301 var forwardAsMenu = document.getElementById("forwardAsMenu");
302 if(forwardAsMenu)
303 forwardAsMenu.setAttribute("disabled", !aMessage);
304
305 var labelMenu = document.getElementById("labelMenu");
306 if(labelMenu)
307 labelMenu.setAttribute("disabled", !aMessage);
308
309 // Disable mark menu when we're not in a folder
310 var markMenu = document.getElementById("markMenu");
311 if(markMenu)
312 markMenu.setAttribute("disabled", !msgFolder);
313
314 document.commandDispatcher.updateCommands('create-menu-message');
315 }
316
317 // initMoveToFolderAgainMenu
318 // enables / disables aMenuItem based on the value of mail.last_msg_movecopy_target_uri
319 // Adjusts the label and accesskey for aMenuItem to include the folder name
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
320 function initMoveToFolderAgainMenu(aMenuItem)
321 {
322 var lastFolderURI = pref.getCharPref("mail.last_msg_movecopy_target_uri");
323 var isMove = pref.getBoolPref("mail.last_msg_movecopy_was_move");
324 if (lastFolderURI)
325 {
326 var destResource = RDF.GetResource(lastFolderURI);
327 var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder);
328 aMenuItem.label = gMessengerBundle.getFormattedString(isMove ?
329 "moveToFolderAgain" : "copyToFolderAgain",
330 [destMsgFolder.prettyName], 1);
331 aMenuItem.setAttribute('accesskey',
332 gMessengerBundle.getString(isMove ?
333 "moveToFolderAgainAccessKey" : "copyToFolderAgainAccessKey"));
334 }
335 }
336
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
337 function InitViewHeadersMenu()
338 {
339 var id = null;
340 var headerchoice = 1;
341 try
342 {
343 headerchoice = pref.getIntPref("mail.show_headers");
344 }
345 catch (ex)
346 {
347 dump("failed to get the header pref\n");
348 }
349
350 switch (headerchoice)
351 {
352 case 2:
353 id = "viewallheaders";
354 break;
355 case 1:
356 default:
357 id = "viewnormalheaders";
358 break;
359 }
360
361 var menuitem = document.getElementById(id);
362 if (menuitem)
363 menuitem.setAttribute("checked", "true");
364 }
365
InitViewBodyMenu
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
366 function InitViewBodyMenu()
367 {
368 var html_as = 0;
369 var prefer_plaintext = false;
370 var disallow_classes = 0;
371 try
372 {
373 prefer_plaintext = pref.getBoolPref("mailnews.display.prefer_plaintext");
374 html_as = pref.getIntPref("mailnews.display.html_as");
375 disallow_classes = pref.getIntPref("mailnews.display.disallow_mime_handlers");
376 if (disallow_classes > 0)
377 gDisallow_classes_no_html = disallow_classes;
378 // else gDisallow_classes_no_html keeps its inital value (see top)
379 }
380 catch (ex)
381 {
382 dump("failed to get the body plaintext vs. HTML prefs\n");
383 }
384
385 var AllowHTML_checked = false;
386 var Sanitized_checked = false;
387 var AsPlaintext_checked = false;
388 if (!prefer_plaintext && !html_as && !disallow_classes)
389 AllowHTML_checked = true;
390 else if (!prefer_plaintext && html_as == 3 && disallow_classes > 0)
391 Sanitized_checked = true;
392 else if (prefer_plaintext && html_as == 1 && disallow_classes > 0)
393 AsPlaintext_checked = true;
394 // else (the user edited prefs/user.js) check none of the radio menu items
395
396 var AllowHTML_menuitem = document.getElementById("bodyAllowHTML");
397 var Sanitized_menuitem = document.getElementById("bodySanitized");
398 var AsPlaintext_menuitem = document.getElementById("bodyAsPlaintext");
399 if (AllowHTML_menuitem && Sanitized_menuitem && AsPlaintext_menuitem)
400 {
401 AllowHTML_menuitem.setAttribute("checked", AllowHTML_checked ? "true" : "false");
402 Sanitized_menuitem.setAttribute("checked", Sanitized_checked ? "true" : "false");
403 AsPlaintext_menuitem.setAttribute("checked", AsPlaintext_checked ? "true" : "false");
404 }
405 else
406 dump("Where is my View|Body menu?\n");
407 }
408
IsNewsMessage
(2 calls, 53 incl. v-uS, 29 excl. v-uS)
Called: ChromeWindow:test (2 calls, 24 v-uS)
Called By: mailWindowOverlay.js:UpdateDeleteCommand (2 calls, 53 v-uS)
409 function IsNewsMessage(messageUri)
410 {
411 return (/^news-message:/.test(messageUri));
412 }
413
IsImapMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
414 function IsImapMessage(messageUri)
415 {
416 return (/^imap-message:/.test(messageUri));
417 }
418
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
419 function SetMenuItemLabel(menuItemId, customLabel)
420 {
421 var menuItem = document.getElementById(menuItemId);
422 if (menuItem)
423 menuItem.setAttribute('label', customLabel);
424 }
425
RemoveAllMessageTags
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
426 function RemoveAllMessageTags()
427 {
428 var selectedMsgUris = GetSelectedMessages();
429 if (!selectedMsgUris.length)
430 return;
431
432 var messages = Components.classes["@mozilla.org/supports-array;1"]
433 .createInstance(Components.interfaces.nsISupportsArray);
434 var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"]
435 .getService(Components.interfaces.nsIMsgTagService);
436 var tagArray = tagService.getAllTags({});
437
438 var allKeys = "";
439 for (j = 0; j < tagArray.length; ++j)
440 {
441 if (j)
442 allKeys += " ";
443 allKeys += tagArray[j].key;
444 }
445
446 var prevHdrFolder = null;
447 // this crudely handles cross-folder virtual folders with selected messages
448 // that spans folders, by coalescing consecutive messages in the selection
449 // that happen to be in the same folder. nsMsgSearchDBView does this better,
450 // but nsIMsgDBView doesn't handle commands with arguments, and untag takes a
451 // key argument. Furthermore, we only delete legacy labels and known tags,
452 // keeping other keywords like (non)junk intact.
453 var j;
454 for (var i = 0; i < selectedMsgUris.length; ++i)
455 {
456 var msgHdr = messenger.msgHdrFromURI(selectedMsgUris[i]);
457 msgHdr.label = 0; // remove legacy label
458 if (prevHdrFolder != msgHdr.folder)
459 {
460 if (prevHdrFolder)
461 prevHdrFolder.removeKeywordsFromMessages(messages, allKeys);
462 messages.Clear();
463 prevHdrFolder = msgHdr.folder;
464 }
465 messages.AppendElement(msgHdr);
466 }
467 if (prevHdrFolder)
468 prevHdrFolder.removeKeywordsFromMessages(messages, allKeys);
469 OnTagsChange();
470 }
471
ToggleMessageTagKey
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
472 function ToggleMessageTagKey(index)
473 {
474 if (GetNumSelectedMessages() < 1)
475 return;
476 // set the tag state based upon that of the first selected message,
477 // just like we do for markAsRead etc.
478 var msgHdr = gDBView.hdrForFirstSelectedMessage;
479 var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"]
480 .getService(Components.interfaces.nsIMsgTagService);
481 var tagArray = tagService.getAllTags({});
482 for (var i = 0; i < tagArray.length; ++i)
483 {
484 var key = tagArray[i].key;
485 if (!--index)
486 {
487 // found the key, now toggle its state
488 var curKeys = msgHdr.getStringProperty("keywords");
489 if (msgHdr.label)
490 curKeys += " $label" + msgHdr.label;
491 var addKey = (" " + curKeys + " ").indexOf(" " + key + " ") < 0;
492 ToggleMessageTag(key, addKey);
493 return;
494 }
495 }
496 }
497
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
498 function ToggleMessageTagMenu(target)
499 {
500 var key = target.getAttribute("value");
501 var addKey = target.getAttribute("checked") == "true";
502 ToggleMessageTag(key, addKey);
503 }
504
ToggleMessageTag
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
505 function ToggleMessageTag(key, addKey)
506 {
507 var messages = Components.classes["@mozilla.org/supports-array;1"]
508 .createInstance(Components.interfaces.nsISupportsArray);
509 var msg = Components.classes["@mozilla.org/supports-array;1"]
510 .createInstance(Components.interfaces.nsISupportsArray);
511 var selectedMsgUris = GetSelectedMessages();
512 var toggler = addKey ? "addKeywordsToMessages" : "removeKeywordsFromMessages";
513 var prevHdrFolder = null;
514 // this crudely handles cross-folder virtual folders with selected messages
515 // that spans folders, by coalescing consecutive msgs in the selection
516 // that happen to be in the same folder. nsMsgSearchDBView does this
517 // better, but nsIMsgDBView doesn't handle commands with arguments,
518 // and (un)tag takes a key argument.
519 for (var i = 0; i < selectedMsgUris.length; ++i)
520 {
521 var msgHdr = messenger.msgHdrFromURI(selectedMsgUris[i]);
522 if (msgHdr.label)
523 {
524 // Since we touch all these messages anyway, migrate the label now.
525 // If we don't, the thread tree won't always show the correct tag state,
526 // because resetting a label doesn't update the tree anymore...
527 msg.Clear();
528 msg.AppendElement(msgHdr);
529 msgHdr.folder.addKeywordsToMessages(msg, "$label" + msgHdr.label);
530 msgHdr.label = 0; // remove legacy label
531 }
532 if (prevHdrFolder != msgHdr.folder)
533 {
534 if (prevHdrFolder)
535 prevHdrFolder[toggler](messages, key);
536 messages.Clear();
537 prevHdrFolder = msgHdr.folder;
538 }
539 messages.AppendElement(msgHdr);
540 }
541 if (prevHdrFolder)
542 prevHdrFolder[toggler](messages, key);
543 OnTagsChange();
544 }
545
AddTag
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
546 function AddTag()
547 {
548 var args = {result: "", okCallback: AddTagCallback};
549 var dialog = window.openDialog("chrome://messenger/content/newTagDialog.xul",
550 "",
551 "chrome,titlebar,modal",
552 args);
553 }
554
AddTagCallback
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
555 function AddTagCallback(name, color)
556 {
557 var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"]
558 .getService(Components.interfaces.nsIMsgTagService);
559 tagService.addTag(name, color, '');
560 try
561 {
562 ToggleMessageTag(tagService.getKeyForTag(name), true);
563 }
564 catch(ex)
565 {
566 return false;
567 }
568 return true;
569 }
570
SetMessageTagLabel
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
571 function SetMessageTagLabel(menuitem, index, name)
572 {
573 // if a <key> is defined for this tag, use its key as the accesskey
574 // (the key for the tag at index n needs to have the id key_tag<n>)
575 var shortcutkey = document.getElementById("key_tag" + index);
576 var accesskey = shortcutkey ? shortcutkey.getAttribute("key") : "";
577 if (accesskey)
578 menuitem.setAttribute("accesskey", accesskey);
579 var label = gMessengerBundle.getFormattedString("mailnews.tags.format",
580 [accesskey, name]);
581 menuitem.setAttribute("label", label);
582 }
583
InitMessageTags
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
584 function InitMessageTags(menuPopup)
585 {
586 var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"]
587 .getService(Components.interfaces.nsIMsgTagService);
588 var tagArray = tagService.getAllTags({});
589 var tagCount = tagArray.length;
590
591 // remove any existing non-static entries...
592 var menuseparator = menuPopup.lastChild.previousSibling;
593 for (var i = menuPopup.childNodes.length; i > 4; --i)
594 menuPopup.removeChild(menuseparator.previousSibling);
595
596 // hide double menuseparator
597 menuseparator.previousSibling.hidden = !tagCount;
598
599 // create label and accesskey for the static remove item
600 var tagRemoveLabel = gMessengerBundle.getString("mailnews.tags.remove");
601 SetMessageTagLabel(menuPopup.firstChild, 0, tagRemoveLabel);
602
603 // now rebuild the list
604 var msgHdr = gDBView.hdrForFirstSelectedMessage;
605 var curKeys = msgHdr.getStringProperty("keywords");
606 if (msgHdr.label)
607 curKeys += " $label" + msgHdr.label;
608
609 for (var i = 0; i < tagCount; ++i)
610 {
611 var taginfo = tagArray[i];
612 // TODO we want to either remove or "check" the tags that already exist
613 var newMenuItem = document.createElement("menuitem");
614 SetMessageTagLabel(newMenuItem, i + 1, taginfo.tag);
615 newMenuItem.setAttribute("value", taginfo.key);
616 newMenuItem.setAttribute("type", "checkbox");
617 var removeKey = (" " + curKeys + " ").indexOf(" " + taginfo.key + " ") > -1;
618 newMenuItem.setAttribute('checked', removeKey);
619 newMenuItem.setAttribute('oncommand', 'ToggleMessageTagMenu(event.target);');
620 var color = taginfo.color;
621 if (color)
622 newMenuItem.setAttribute("class", "lc-" + color.substr(1));
623 menuPopup.insertBefore(newMenuItem, menuseparator);
624 }
625 }
626
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
627 function backToolbarMenu_init(menuPopup)
628 {
629 populateHistoryMenu(menuPopup, true);
630 }
631
632 var gNavDebug = false;
navDebug
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
633 function navDebug(str)
634 {
635 if (gNavDebug)
636 dump(str);
637 }
638
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
639 function populateHistoryMenu(menuPopup, isBackMenu)
640 {
641 // remove existing entries
642 while (menuPopup.firstChild)
643 menuPopup.removeChild(menuPopup.firstChild);
644 var curPos = new Object;
645 var numEntries = new Object;
646 var historyEntries = new Object;
647 messenger.getNavigateHistory(curPos, numEntries, historyEntries);
648 curPos.value = curPos.value * 2;
649 navDebug("curPos = " + curPos.value + " numEntries = " + numEntries.value + "\n");
650 var historyArray = historyEntries.value;
651 var folder;
652 var newMenuItem;
653 if (GetLoadedMessage())
654 {
655 if (!isBackMenu)
656 curPos.value += 2;
657 else
658 curPos.value -= 2;
659 }
660 // for populating the back menu, we want the most recently visited
661 // messages first in the menu. So we go backward from curPos to 0.
662 // For the forward menu, we want to go forward from curPos to the end.
663
664 var relPos = 0;
665 for (var i = curPos.value; (isBackMenu) ? i >= 0 : i < historyArray.length; i += ((isBackMenu) ? -2 : 2))
666 {
667 navDebug("history[" + i + "] = " + historyArray[i] + "\n");
668 navDebug("history[" + i + "] = " + historyArray[i + 1] + "\n");
669 folder = RDF.GetResource(historyArray[i + 1]).QueryInterface(Components.interfaces.nsIMsgFolder);
670 navDebug("folder URI = " + folder.URI + "pretty name " + folder.prettyName + "\n");
671 var menuText = "";
672
673 var msgHdr = messenger.msgHdrFromURI(historyArray[i]);
674 if (!IsCurrentLoadedFolder(folder))
675 menuText = folder.prettyName + " - ";
676
677 var subject = "";
678 if(msgHdr.flags & MSG_FLAG_HAS_RE)
679 subject = "Re: ";
680 if (msgHdr.mime2DecodedSubject)
681 subject += msgHdr.mime2DecodedSubject;
682 if (subject)
683 menuText += subject + " - ";
684
685 menuText += msgHdr.mime2DecodedAuthor;
686 newMenuItem = document.createElement('menuitem');
687 newMenuItem.setAttribute('label', menuText);
688 relPos += isBackMenu ? -1 : 1;
689 newMenuItem.setAttribute('value', relPos);
690 newMenuItem.setAttribute('oncommand', 'NavigateToUri(event.target); event.stopPropagation();');
691 menuPopup.appendChild(newMenuItem);
692 if (! (relPos % 20))
693 break;
694 }
695
696 }
697
NavigateToUri
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
698 function NavigateToUri(target)
699 {
700 var historyIndex = target.getAttribute('value');
701 var folderUri = messenger.getFolderUriAtNavigatePos(historyIndex);
702 var msgUri = messenger.getMsgUriAtNavigatePos(historyIndex);
703 var folder = RDF.GetResource(folderUri).QueryInterface(Components.interfaces.nsIMsgFolder);
704 var msgHdr = messenger.msgHdrFromURI(msgUri);
705 navDebug("navigating from " + messenger.navigatePos + " by " + historyIndex + " to " + msgUri + "\n");
706 navDebug("folderUri = " + folderUri + "\n");
707 // this "- 0" seems to ensure that historyIndex is treated as an int, not a string.
708 messenger.navigatePos += (historyIndex - 0);
709 LoadNavigatedToMessage(msgHdr, folder, folderUri);
710 }
711
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
712 function forwardToolbarMenu_init(menuPopup)
713 {
714 populateHistoryMenu(menuPopup, false);
715 }
716
InitMessageMark
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
717 function InitMessageMark()
718 {
719 var areMessagesRead = SelectedMessagesAreRead();
720 var readItem = document.getElementById("cmd_markAsRead");
721 if(readItem)
722 readItem.setAttribute("checked", areMessagesRead);
723
724 var areMessagesFlagged = SelectedMessagesAreFlagged();
725 var flaggedItem = document.getElementById("cmd_markAsFlagged");
726 if(flaggedItem)
727 flaggedItem.setAttribute("checked", areMessagesFlagged);
728
729 document.commandDispatcher.updateCommands('create-menu-mark');
730 }
731
UpdateJunkToolbarButton
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
732 function UpdateJunkToolbarButton()
733 {
734 var junkButtonDeck = document.getElementById("junk-deck");
735 if (junkButtonDeck)
736 junkButtonDeck.selectedIndex = SelectedMessagesAreJunk() ? 1 : 0;
737 }
738
UpdateDeleteCommand
(2 calls, 978 incl. v-uS, 124 excl. v-uS)
Called: globalOverlay.js:goSetAccessKey (2 calls, 281 v-uS)
globalOverlay.js:goSetMenuValue (2 calls, 291 v-uS)
mail3PaneWindowCommands.js:GetNumSelectedMessages (2 calls, 50 v-uS)
mailWindowOverlay.js:IsNewsMessage (2 calls, 53 v-uS)
mailWindowOverlay.js:SelectedMessagesAreDeleted (2 calls, 102 v-uS)
msgMail3PaneWindow.js:GetFirstSelectedMessage (2 calls, 75 v-uS)
Called By: mail3PaneWindowCommands.js:isCommandEnabled (2 calls, 978 v-uS)
739 function UpdateDeleteCommand()
740 {
741 var value = "value";
742 var uri = GetFirstSelectedMessage();
743 if (IsNewsMessage(uri))
744 value += "News";
745 else if (SelectedMessagesAreDeleted())
746 value += "IMAPDeleted";
747 if (GetNumSelectedMessages() < 2)
748 value += "Message";
749 else
750 value += "Messages";
751 goSetMenuValue("cmd_delete", value);
752 goSetAccessKey("cmd_delete", value + "AccessKey");
753 }
754
SelectedMessagesAreDeleted
(2 calls, 102 incl. v-uS, 53 excl. v-uS)
Called: XPCWrappedNative_NoHelper:flags (2 calls, 20 v-uS)
XPCWrappedNative_NoHelper:hdrForFirstSelectedMessage (2 calls, 28 v-uS)
Called By: mailWindowOverlay.js:UpdateDeleteCommand (2 calls, 102 v-uS)
755 function SelectedMessagesAreDeleted()
756 {
757 try {
758 return gDBView.hdrForFirstSelectedMessage.flags & MSG_FLAG_IMAP_DELETED;
759 }
760 catch (ex) {
761 return 0;
762 }
763 }
764
SelectedMessagesAreJunk
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
765 function SelectedMessagesAreJunk()
766 {
767 var isJunk;
768 try {
769 var junkScore = gDBView.hdrForFirstSelectedMessage.getStringProperty("junkscore");
770 isJunk = ((junkScore != "") && (junkScore != "0"));
771 }
772 catch (ex) {
773 isJunk = false;
774 }
775 return isJunk;
776 }
777
SelectedMessagesAreRead
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
778 function SelectedMessagesAreRead()
779 {
780 var isRead;
781 try {
782 isRead = gDBView.hdrForFirstSelectedMessage.isRead;
783 }
784 catch (ex) {
785 isRead = false;
786 }
787 return isRead;
788 }
789
SelectedMessagesAreFlagged
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
790 function SelectedMessagesAreFlagged()
791 {
792 var isFlagged;
793 try {
794 isFlagged = gDBView.hdrForFirstSelectedMessage.isFlagged;
795 }
796 catch (ex) {
797 isFlagged = false;
798 }
799 return isFlagged;
800 }
801
GetFirstSelectedMsgFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
802 function GetFirstSelectedMsgFolder()
803 {
804 var result = null;
805 var selectedFolders = GetSelectedMsgFolders();
806 if (selectedFolders.length > 0) {
807 result = selectedFolders[0];
808 }
809
810 return result;
811 }
812
GetInboxFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
813 function GetInboxFolder(server)
814 {
815 try {
816 var rootMsgFolder = server.rootMsgFolder;
817
818 //now find Inbox
819 var outNumFolders = new Object();
820 var inboxFolder = rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders);
821
822 return inboxFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
823 }
824 catch (ex) {
825 dump(ex + "\n");
826 }
827 return null;
828 }
829
GetMessagesForInboxOnServer
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
830 function GetMessagesForInboxOnServer(server)
831 {
832 var inboxFolder = GetInboxFolder(server);
833
834 // if the server doesn't support an inbox it could be an RSS server or some other server type..
835 // just use the root folder and the server implementation can figure out what to do.
836 if (!inboxFolder)
837 inboxFolder = server.rootFolder;
838
839 GetNewMessages([inboxFolder], server);
840 }
841
MsgGetMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
842 function MsgGetMessage()
843 {
844 // if offline, prompt for getting messages
845 if (MailOfflineMgr.isOnline() || MailOfflineMgr.getNewMail())
846 GetFolderMessages();
847 }
848
MsgGetMessagesForAllServers
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
849 function MsgGetMessagesForAllServers(defaultServer)
850 {
851 // now log into any server
852 try
853 {
854 var allServers = accountManager.allServers;
855 var i;
856 // array of isupportsarrays of servers for a particular folder
857 var pop3DownloadServersArray = new Array();
858 // parallel isupports array of folders to download to...
859 var localFoldersToDownloadTo = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
860 var pop3Server;
861
862 for (i = 0; i < allServers.Count(); ++i)
863 {
864 var currentServer = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
865 var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + currentServer.type].getService(Components.interfaces.nsIMsgProtocolInfo);
866 if (protocolinfo.canLoginAtStartUp && currentServer.loginAtStartUp)
867 {
868 if (defaultServer && defaultServer.equals(currentServer) &&
869 !defaultServer.isDeferredTo &&
870 defaultServer.rootFolder == defaultServer.rootMsgFolder)
871 {
872 dump(currentServer.serverURI + "...skipping, already opened\n");
873 }
874 else if (currentServer.type == "pop3" && currentServer.downloadOnBiff)
875 {
876 CoalesceGetMsgsForPop3ServersByDestFolder(currentServer, pop3DownloadServersArray, localFoldersToDownloadTo);
877 pop3Server = currentServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer);
878 }
879 else
880 {
881 // Check to see if there are new messages on the server
882 currentServer.performBiff(msgWindow);
883 }
884 }
885 }
886 for (i = 0; i < pop3DownloadServersArray.length; ++i)
887 {
888 // any ol' pop3Server will do - the serversArray specifies which servers to download from
889 pop3Server.downloadMailFromServers(pop3DownloadServersArray[i], msgWindow, localFoldersToDownloadTo.GetElementAt(i), null);
890 }
891 }
892 catch(ex)
893 {
894 dump(ex + "\n");
895 }
896 }
897
898 /**
899 * Get messages for all those accounts which have the capability
900 * of getting messages and have session password available i.e.,
901 * curretnly logged in accounts.
902 * if offline, prompt for getting messages.
903 */
MsgGetMessagesForAllAuthenticatedAccounts
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
904 function MsgGetMessagesForAllAuthenticatedAccounts()
905 {
906 if (MailOfflineMgr.isOnline() || MailOfflineMgr.getNewMail())
907 GetMessagesForAllAuthenticatedAccounts();
908 }
909
910 /**
911 * Get messages for the account selected from Menu dropdowns.
912 * if offline, prompt for getting messages.
913 *
914 * @param aFolder (optional) a folder in the account for which messages should
915 * be retrieved. If null, all accounts will be used.
916 */
MsgGetMessagesForAccount
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
917 function MsgGetMessagesForAccount(aFolder)
918 {
919 if (!aFolder) {
920 MsgGetMessagesForAllServers();
921 return;
922 }
923
924 if (MailOfflineMgr.isOnline() || MailOfflineMgr.getNewMail()) {
925 var server = aFolder.server;
926 GetMessagesForInboxOnServer(server);
927 }
928 }
929
930 // if offline, prompt for getNextNMessages
MsgGetNextNMessages
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
931 function MsgGetNextNMessages()
932 {
933 var folder;
934 if (MailOfflineMgr.isOnline() || MailOfflineMgr.getNewMail())
935 {
936 folder = GetFirstSelectedMsgFolder();
937 if (folder)
938 GetNextNMessages(folder);
939 }
940 }
941
MsgDeleteMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
942 function MsgDeleteMessage(reallyDelete, fromToolbar)
943 {
944 // if from the toolbar, return right away if this is a news message
945 // only allow cancel from the menu: "Edit | Cancel / Delete Message"
946 if (fromToolbar)
947 {
948 var srcFolder = GetLoadedMsgFolder();
949 var folderResource = srcFolder.QueryInterface(Components.interfaces.nsIRDFResource);
950 var uri = folderResource.Value;
951 if (isNewsURI(uri)) {
952 // if news, don't delete
953 return;
954 }
955 }
956
957 SetNextMessageAfterDelete();
958 if (reallyDelete) {
959 gDBView.doCommand(nsMsgViewCommandType.deleteNoTrash);
960 }
961 else {
962 gDBView.doCommand(nsMsgViewCommandType.deleteMsg);
963 }
964 }
965
966 // MsgCopyMessage
967 // Copies the selected messages to the destination folder
968 // aDestFolderURI -- the URI of the destination folder
MsgCopyMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
969 function MsgCopyMessage(aDestFolderURI)
970 {
971 try {
972 // get the msg folder we're copying messages into
973 var destResource = RDF.GetResource(aDestFolderURI);
974 var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder);
975 gDBView.doCommandWithFolder(nsMsgViewCommandType.copyMessages, destMsgFolder);
976 pref.setCharPref("mail.last_msg_movecopy_target_uri", aDestFolderURI);
977 pref.setBoolPref("mail.last_msg_movecopy_was_move", false);
978 }
979 catch (ex) {
980 dump("MsgCopyMessage failed: " + ex + "\n");
981 }
982 }
983
984 // MsgMoveMessage
985 // Moves the selected messages to the destination folder
986 // aDestFolderURI -- the URI of the destination folder
MsgMoveMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
987 function MsgMoveMessage(aDestFolderURI)
988 {
989 try {
990 // get the msg folder we're moving messages into
991 // var destUri = destFolder.getAttribute('id');
992 var destResource = RDF.GetResource(aDestFolderURI);
993 var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder);
994 // we don't move news messages, we copy them
995 if (isNewsURI(gDBView.msgFolder.URI))
996 gDBView.doCommandWithFolder(nsMsgViewCommandType.copyMessages, destMsgFolder);
997 else
998 {
999 SetNextMessageAfterDelete();
1000 gDBView.doCommandWithFolder(nsMsgViewCommandType.moveMessages, destMsgFolder);
1001 }
1002 pref.setCharPref("mail.last_msg_movecopy_target_uri", aDestFolderURI);
1003 pref.setBoolPref("mail.last_msg_movecopy_was_move", true);
1004 }
1005 catch (ex) {
1006 dump("MsgMoveMessage failed: " + ex + "\n");
1007 }
1008 }
1009
1010 /**
1011 * Calls the ComposeMessage function with the desired type, and proper default
1012 * based on the event that fired it.
1013 *
1014 * @param aCompType the nsIMsgCompType to pass to the function
1015 * @param aEvent (optional) the event that triggered the call
1016 */
composeMsgByType
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1017 function composeMsgByType(aCompType, aEvent) {
1018 if (aEvent && aEvent.shiftKey) {
1019 ComposeMessage(aCompType,
1020 Components.interfaces.nsIMsgCompFormat.OppositeOfDefault,
1021 GetFirstSelectedMsgFolder(), GetSelectedMessages());
1022 } else {
1023 ComposeMessage(aCompType, Components.interfaces.nsIMsgCompFormat.Default,
1024 GetFirstSelectedMsgFolder(), GetSelectedMessages());
1025 }
1026 }
1027
MsgNewMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1028 function MsgNewMessage(event)
1029 {
1030 composeMsgByType(Components.interfaces.nsIMsgCompType.New, event);
1031 }
1032
MsgReplyMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1033 function MsgReplyMessage(event)
1034 {
1035 var loadedFolder = GetLoadedMsgFolder();
1036 if (loadedFolder)
1037 {
1038 var server = loadedFolder.server;
1039
1040 if(server && server.type == "nntp")
1041 {
1042 MsgReplyGroup(event);
1043 return;
1044 }
1045 }
1046 MsgReplySender(event);
1047 }
1048
MsgReplySender
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1049 function MsgReplySender(event)
1050 {
1051 composeMsgByType(Components.interfaces.nsIMsgCompType.ReplyToSender, event);
1052 }
1053
MsgReplyGroup
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1054 function MsgReplyGroup(event)
1055 {
1056 composeMsgByType(Components.interfaces.nsIMsgCompType.ReplyToGroup, event);
1057 }
1058
MsgReplyToAllMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1059 function MsgReplyToAllMessage(event)
1060 {
1061 composeMsgByType(Components.interfaces.nsIMsgCompType.ReplyAll, event);
1062 }
1063
MsgForwardMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1064 function MsgForwardMessage(event)
1065 {
1066 var forwardType = 0;
1067 try {
1068 forwardType = gPrefBranch.getIntPref("mail.forward_message_mode");
1069 }
1070 catch (ex) {
1071 dump("failed to retrieve pref mail.forward_message_mode");
1072 }
1073
1074 // mail.forward_message_mode could be 1, if the user migrated from 4.x
1075 // 1 (forward as quoted) is obsolete, so we treat is as forward inline
1076 // since that is more like forward as quoted then forward as attachment
1077 if (forwardType == 0)
1078 MsgForwardAsAttachment(event);
1079 else
1080 MsgForwardAsInline(event);
1081 }
1082
MsgForwardAsAttachment
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1083 function MsgForwardAsAttachment(event)
1084 {
1085 composeMsgByType(Components.interfaces.nsIMsgCompType.ForwardAsAttachment, event);
1086 }
1087
MsgForwardAsInline
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1088 function MsgForwardAsInline(event)
1089 {
1090 composeMsgByType(Components.interfaces.nsIMsgCompType.ForwardInline, event);
1091 }
1092
1093
MsgEditMessageAsNew
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1094 function MsgEditMessageAsNew()
1095 {
1096 composeMsgByType(Components.interfaces.nsIMsgCompType.Template);
1097 }
1098
MsgCreateFilter
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1099 function MsgCreateFilter()
1100 {
1101 // retrieve Sender direct from selected message's headers
1102 var msgHdr = gDBView.hdrForFirstSelectedMessage;
1103 var headerParser = Components.classes["@mozilla.org/messenger/headerparser;1"].getService(Components.interfaces.nsIMsgHeaderParser);
1104 var emailAddress = headerParser.extractHeaderAddressMailboxes(null, msgHdr.author);
1105 if (emailAddress)
1106 top.MsgFilters(emailAddress, null);
1107 }
1108
1109
MsgHome
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1110 function MsgHome(url)
1111 {
1112 window.open(url, "_blank", "chrome,dependent=yes,all");
1113 }
1114
MsgNewFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1115 function MsgNewFolder(callBackFunctionName)
1116 {
1117 var preselectedFolder = GetFirstSelectedMsgFolder();
1118 var dualUseFolders = true;
1119 var server = null;
1120 var destinationFolder = null;
1121
1122 if (preselectedFolder)
1123 {
1124 try {
1125 server = preselectedFolder.server;
1126 if (server)
1127 {
1128 destinationFolder = getDestinationFolder(preselectedFolder, server);
1129
1130 var imapServer =
1131 server.QueryInterface(Components.interfaces.nsIImapIncomingServer);
1132 if (imapServer)
1133 dualUseFolders = imapServer.dualUseFolders;
1134 }
1135 } catch (e) {
1136 dump ("Exception: dualUseFolders = true\n");
1137 }
1138 }
1139 CreateNewSubfolder("chrome://messenger/content/newFolderDialog.xul", destinationFolder, dualUseFolders, callBackFunctionName);
1140 }
1141
getDestinationFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1142 function getDestinationFolder(preselectedFolder, server)
1143 {
1144 var destinationFolder = null;
1145
1146 var isCreateSubfolders = preselectedFolder.canCreateSubfolders;
1147 if (!isCreateSubfolders)
1148 {
1149 destinationFolder = server.rootMsgFolder;
1150
1151 var verifyCreateSubfolders = null;
1152 if (destinationFolder)
1153 verifyCreateSubfolders = destinationFolder.canCreateSubfolders;
1154
1155 // in case the server cannot have subfolders,
1156 // get default account and set its incoming server as parent folder
1157 if (!verifyCreateSubfolders)
1158 {
1159 try {
1160 var defaultFolder = GetDefaultAccountRootFolder();
1161 var checkCreateSubfolders = null;
1162 if (defaultFolder)
1163 checkCreateSubfolders = defaultFolder.canCreateSubfolders;
1164
1165 if (checkCreateSubfolders)
1166 destinationFolder = defaultFolder;
1167
1168 } catch (e) {
1169 dump ("Exception: defaultAccount Not Available\n");
1170 }
1171 }
1172 }
1173 else
1174 destinationFolder = preselectedFolder;
1175
1176 return destinationFolder;
1177 }
1178
1179 /** Open subscribe window. */
MsgSubscribe
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1180 function MsgSubscribe()
1181 {
1182 var preselectedFolder = GetFirstSelectedMsgFolder();
1183
1184 var server = (preselectedFolder) ? preselectedFolder.server : null;
1185 if (server && server.type == "rss")
1186 openSubscriptionsDialog(preselectedFolder); // open feed subscription dialog
1187 else
1188 Subscribe(preselectedFolder); // open imap/nntp subscription dialog
1189 }
1190
ConfirmUnsubscribe
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1191 function ConfirmUnsubscribe(folder)
1192 {
1193 if (!gMessengerBundle)
1194 gMessengerBundle = document.getElementById("bundle_messenger");
1195
1196 var titleMsg = gMessengerBundle.getString("confirmUnsubscribeTitle");
1197 var dialogMsg = gMessengerBundle.getFormattedString("confirmUnsubscribeText",
1198 [folder.name], 1);
1199
1200 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
1201 return promptService.confirm(window, titleMsg, dialogMsg);
1202 }
1203
MsgUnsubscribe
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1204 function MsgUnsubscribe()
1205 {
1206 var folder = GetFirstSelectedMsgFolder();
1207 if (ConfirmUnsubscribe(folder)) {
1208 UnSubscribe(folder);
1209 }
1210 }
1211
ToggleFavoriteFolderFlag
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1212 function ToggleFavoriteFolderFlag()
1213 {
1214 var folder = GetFirstSelectedMsgFolder();
1215 folder.toggleFlag(MSG_FOLDER_FLAG_FAVORITE);
1216 }
1217
MsgSaveAsFile
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1218 function MsgSaveAsFile()
1219 {
1220 if (GetNumSelectedMessages() == 1)
1221 SaveAsFile(GetFirstSelectedMessage());
1222 }
1223
MsgSaveAsTemplate
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1224 function MsgSaveAsTemplate()
1225 {
1226 var folder = GetLoadedMsgFolder();
1227 if (GetNumSelectedMessages() == 1)
1228 SaveAsTemplate(GetFirstSelectedMessage(), folder);
1229 }
1230
MsgOpenNewWindowForMsgHdr
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1231 function MsgOpenNewWindowForMsgHdr(hdr)
1232 {
1233 MsgOpenNewWindowForFolder(hdr.folder.URI, hdr.messageKey);
1234 }
1235
MsgOpenNewWindowForFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1236 function MsgOpenNewWindowForFolder(uri, key)
1237 {
1238 var uriToOpen = uri;
1239 var keyToSelect = key;
1240
1241 if (!uriToOpen)
1242 // use GetSelectedFolderURI() to find out which message to open instead of
1243 // GetLoadedMsgFolder().QueryIntervace(Components.interfaces.nsIRDFResource).value.
1244 // This is required because on a right-click, the currentIndex value will be
1245 // different from the actual row that is highlighted. GetSelectedFolderURI()
1246 // will return the message that is highlighted.
1247 uriToOpen = GetSelectedFolderURI();
1248
1249 if (uriToOpen)
1250 window.openDialog("chrome://messenger/content/", "_blank", "chrome,all,dialog=no", uriToOpen, keyToSelect);
1251 }
1252
1253 /**
1254 *saveMailTabInfo - a private helper routine shared by message and folder tab owners to save
1255 * the local state of a mail tab
1256 * @param aMailTabOwner
1257 */
saveMailTabInfo
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1258 function saveMailTabInfo(aMailTabOwner)
1259 {
1260 if (aMailTabOwner)
1261 {
1262 aMailTabOwner.messenger = messenger;
1263 aMailTabOwner.dbView = gDBView;
1264 aMailTabOwner.searchSession = gSearchSession;
1265 var indices = GetSelectedIndices(gDBView);
1266 if (indices)
1267 {
1268 aMailTabOwner.selectedKeys = new Array(indices.length);
1269 aMailTabOwner.selectedFolders = new Array(indices.length);
1270 }
1271 if (gDBView.currentlyDisplayedMessage != -1)
1272 {
1273 try // there may not be a selected message.
1274 {
1275 var curMsgHdr = gDBView.hdrForFirstSelectedMessage;
1276 aMailTabOwner.selectedMsgId = curMsgHdr.messageId;
1277 aMailTabOwner.msgSelectedFolder = curMsgHdr.folder;
1278 }
1279 catch (ex) {aMailTabOwner.msgSelectedFolder = gMsgFolderSelected};
1280 }
1281 else
1282 {
1283 aMailTabOwner.selectedMsgId = null;
1284 aMailTabOwner.msgSelectedFolder = null;
1285 }
1286 if (indices)
1287 {
1288 for (var i = 0; i < indices.length; i++)
1289 {
1290 aMailTabOwner.selectedKeys[i] = gDBView.getKeyAt(i);
1291 aMailTabOwner.selectedFolders[i] = gDBView.getFolderForViewIndex(i);
1292 }
1293 }
1294 }
1295 }
1296
1297 /**
1298 * setMailTabState - a private helper routine shared by message and folder tab owners for setting up various
1299 global variables based on the current tab.
1300 * @param aMailTabOwner
1301 */
setMailTabState
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1302 function setMailTabState(aMailTabOwner)
1303 {
1304 messenger = aMailTabOwner.messenger;
1305 gDBView = aMailTabOwner.dbView;
1306 gSearchSession = aMailTabOwner.searchSession;
1307 if (gDBView)
1308 {
1309 var folderTree = GetFolderTree();
1310 var row = EnsureFolderIndex(folderTree.builderView, gDBView.msgFolder);
1311
1312 var folderTreeBoxObj = folderTree.treeBoxObject;
1313 var folderTreeSelection = folderTreeBoxObj.view.selection;
1314 // make sure that row.value is valid so that it doesn't mess up
1315 // the call to ensureRowIsVisible().
1316 if((row >= 0) && !folderTreeSelection.isSelected(row))
1317 {
1318 gMsgFolderSelected = gDBView.msgFolder;
1319 folderTreeSelection.selectEventsSuppressed = true;
1320 folderTreeSelection.select(row);
1321 folderTreeBoxObj.ensureRowIsVisible(row);
1322 folderTreeSelection.selectEventsSuppressed = false;
1323 }
1324 // this sets the thread pane tree's view to the gDBView view.
1325 UpdateSortIndicators(gDBView.sortType, gDBView.sortOrder);
1326 RerootThreadPane();
1327 // we need to restore the selection to what it was when we switched away from this tab.
1328 // we need to remember the selected keys, instead of the selected indices, since the view
1329 // might have changed. But maybe the selectedIndices adjust as items are added/removed from
1330 // the (hidden) view.
1331 ClearThreadPaneSelection();
1332 try
1333 {
1334 if (aMailTabOwner.selectedMsgId && aMailTabOwner.msgSelectedFolder)
1335 {
1336 var msgDB = aMailTabOwner.msgSelectedFolder.getMsgDatabase(msgWindow);
1337 var msgHdr = msgDB.getMsgHdrForMessageID(aMailTabOwner.selectedMsgId);
1338 setTimeout(gDBView.selectFolderMsgByKey, 0, aMailTabOwner.msgSelectedFolder, msgHdr.messageKey);
1339 }
1340 }
1341 catch (ex) {dump(ex);}
1342 }
1343 else
1344 {
1345 var tree = GetThreadTree();
1346 tree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject).view = null;
1347 ClearMessagePane();
1348 }
1349 }
1350
CreateToolbarTooltip
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1351 function CreateToolbarTooltip(document, event)
1352 {
1353 event.stopPropagation();
1354 var tn = document.tooltipNode;
1355 if (tn.localName != "tab")
1356 return false; // Not a tab, so cancel the tooltip
1357 if ("mOverCloseButton" in tn && tn.mOverCloseButton) {
1358 event.target.setAttribute("label", tn.getAttribute("closetabtext"));
1359 return true;
1360 }
1361 if (tn.hasAttribute("label")) {
1362 event.target.setAttribute("label", tn.getAttribute("label"));
1363 return true;
1364 }
1365 return false;
1366 }
1367
DisplayFolderAndThreadPane
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1368 function DisplayFolderAndThreadPane(show)
1369 {
1370 var collapse = !show;
1371 if (pref.getIntPref("mail.pane_config.dynamic") == kWidePaneConfig)
1372 {
1373 document.getElementById("messengerBox").collapsed = collapse;
1374 // if opening a standalone message, need to give the messagepanebox flex.
1375 if (collapse)
1376 document.getElementById("messagepanebox").flex = 1;
1377 }
1378
1379 document.getElementById("displayDeck").collapsed = collapse;
1380 document.getElementById("threadpane-splitter").collapsed = collapse;
1381 document.getElementById("folderpane_splitter").collapsed = collapse;
1382 document.getElementById("folderPaneBox").collapsed = collapse;
1383 try {
1384 document.getElementById("search-container").collapsed = collapse;
1385 } catch (ex) {}
1386 try {
1387 document.getElementById("folder-location-container").collapsed = collapse;
1388 } catch (ex) {}
1389 try {
1390 document.getElementById("mailviews-container").collapsed = collapse;
1391 } catch (ex) {}
1392 }
1393
1394 /**
1395 * openFolderTab - a private helper method used by folder and message tab owners.
1396 * @param aMailTabOwner
1397 */
openFolderTab
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1398 function openFolderTab(aMailTabOwner)
1399 {
1400 ClearThreadPaneSelection();
1401 CreateMessenger();
1402 messenger.setWindow(window, msgWindow);
1403 aMailTabOwner.msgSelectedFolder = gMsgFolderSelected;
1404 // clear selection, because context clicking on a folder and opening in a new
1405 // tab needs to have SelectFolder think the selection has changed.
1406 // We also need to clear these globals to subvert the code that prevents
1407 // folder loads when things haven't changed.
1408 GetFolderTree().view.selection.clearSelection();
1409 GetFolderTree().view.selection.currentIndex = -1;
1410 gMsgFolderSelected = null;
1411 msgWindow.openFolder = null;
1412 // clear thread pane selection - otherwise, the tree tries to impose
1413 // the current selection on the new view.
1414 gDBView = null; // clear gDBView so we won't try to close it.
1415 SelectFolder(aMailTabOwner.uriToOpen);
1416 aMailTabOwner.dbView = gDBView;
1417 }
1418
folderTabOwner
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1419 function folderTabOwner()
1420 {
1421 saveMailTabInfo(this);
1422 }
1423
1424 folderTabOwner.prototype =
1425 {
open
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1426 open : function ()
1427 {
1428 openFolderTab(this);
1429 },
1430
close
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1431 close : function ()
1432 {
1433 if (this.dbView)
1434 this.dbView.close();
1435 if (this.messenger)
1436 this.messenger.setWindow(null, null);
1437 },
1438
saveCurrentInfo
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1439 saveCurrentInfo : function()
1440 {
1441 saveMailTabInfo(this);
1442 },
1443
onSelect
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1444 onSelect : function(aPreviousTabOwner)
1445 {
1446 if (aPreviousTabOwner.type != this.type)
1447 {
1448 ClearMessagePane();
1449 DisplayFolderAndThreadPane(true);
1450 }
1451 setMailTabState(this);
1452 },
1453
onTitleChanged
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1454 onTitleChanged: function(aTab)
1455 {
1456 // the user may have changed folders, triggering our onTitleChanged callback.
1457 // update the appropriate attributes on the tab.
1458 aTab.setAttribute('SpecialFolder', GetFolderAttribute(GetFolderTree(), gMsgFolderSelected, 'SpecialFolder'));
1459 aTab.setAttribute('ServerType', GetFolderAttribute(GetFolderTree(), gMsgFolderSelected, 'ServerType'));
1460 return;
1461 },
1462
get_title
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1463 get title()
1464 {
1465 // this only works if we are the owner of the current tab...
1466 return gMsgFolderSelected.prettyName;
1467 },
1468
1469 type : "folder",
1470 };
1471
messageTabOwner
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1472 function messageTabOwner()
1473 {
1474 saveMailTabInfo(this);
1475 }
1476
1477 messageTabOwner.prototype =
1478 {
open
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1479 open : function ()
1480 {
1481 openFolderTab(this);
1482 gCurrentlyDisplayedMessage = -1;
1483 ClearThreadPaneSelection();
1484 setTimeout(gDBView.selectFolderMsgByKey, 0, this.hdr.folder, this.hdr.messageKey);
1485 // let's try hiding the thread pane and folder pane
1486 DisplayFolderAndThreadPane(false);
1487 },
1488
close
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1489 close : function ()
1490 {
1491 if (this.dbView)
1492 this.dbView.close();
1493 if (this.messenger)
1494 this.messenger.setWindow(null, null);
1495 },
1496
saveCurrentInfo
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1497 saveCurrentInfo : function()
1498 {
1499 saveMailTabInfo(this);
1500 },
1501
onSelect
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1502 onSelect : function(aPreviousTabOwner)
1503 {
1504 if (aPreviousTabOwner.type != this.type)
1505 {
1506 ClearMessagePane();
1507 DisplayFolderAndThreadPane(false);
1508 }
1509 setMailTabState(this);
1510 },
1511
onTitleChanged
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1512 onTitleChanged: function(aTab)
1513 {
1514 return;
1515 },
1516
get_title
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1517 get title()
1518 {
1519 return this.hdr.mime2DecodedSubject;
1520 },
1521
1522 type : "message",
1523 };
1524
MsgOpenNewTabForFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1525 function MsgOpenNewTabForFolder(uri, key)
1526 {
1527 var uriToOpen = uri;
1528 var keyToSelect = key;
1529
1530 if (!uriToOpen)
1531 // use GetSelectedFolderURI() to find out which message to open instead of
1532 // GetLoadedMsgFolder().QueryIntervace(Components.interfaces.nsIRDFResource).value.
1533 // This is required because on a right-click, the currentIndex value will be
1534 // different from the actual row that is highlighted. GetSelectedFolderURI()
1535 // will return the message that is highlighted.
1536 uriToOpen = GetSelectedFolderURI();
1537
1538 // set up the first tab, which was previously invisible.
1539 // This assumes the first tab is always a 3-pane ui, which
1540 // may not be right, especially if we have the ability
1541 // to persist your tab setup.
1542 var newTab = new folderTabOwner();
1543 newTab.uriToOpen = uriToOpen;
1544 document.getElementById('tabmail').addTab(newTab);
1545 }
1546
MsgOpenNewTabForMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1547 function MsgOpenNewTabForMessage(messageKey, folderUri)
1548 {
1549 if (!messageKey)
1550 messageKey = gDBView.keyForFirstSelectedMessage;
1551
1552 var hdr = gDBView.hdrForFirstSelectedMessage;
1553 if (!folderUri)
1554 // use the header's folder - this will open a msg in a virtual folder view
1555 // in its real folder, which is needed if the msg wouldn't be in a new
1556 // view with the same terms - e.g., it's read and the view is unread only.
1557 // If we cloned the view, we wouldn't have to do this.
1558 folderUri = hdr.folder.URI;
1559
1560 // fix it so we won't try to load the previously loaded message.
1561 hdr.folder.lastMessageLoaded = nsMsgKey_None;
1562
1563 tab = new messageTabOwner();
1564 tab.uriToOpen = folderUri;
1565 tab.hdr = hdr;
1566 document.getElementById('tabmail').addTab(tab);
1567 }
1568
1569 // passing in the view, so this will work for search and the thread pane
MsgOpenSelectedMessages
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1570 function MsgOpenSelectedMessages()
1571 {
1572 var dbView = GetDBView();
1573
1574 var indices = GetSelectedIndices(dbView);
1575 var numMessages = indices.length;
1576
1577 var windowReuse = gPrefBranch.getBoolPref("mailnews.reuse_message_window");
1578 // This is a radio type button pref, currently with only 2 buttons.
1579 // We need to keep the pref type as 'bool' for backwards compatibility
1580 // with 4.x migrated prefs. For future radio button(s), please use another
1581 // pref (either 'bool' or 'int' type) to describe it.
1582 //
1583 // windowReuse values: false, true
1584 // false: open new standalone message window for each message
1585 // true : reuse existing standalone message window for each message
1586 if (windowReuse && numMessages == 1 &&
1587 MsgOpenSelectedMessageInExistingWindow())
1588 return;
1589
1590 var openWindowWarning = gPrefBranch.getIntPref("mailnews.open_window_warning");
1591 if ((openWindowWarning > 1) && (numMessages >= openWindowWarning)) {
1592 if (!gMessengerBundle)
1593 gMessengerBundle = document.getElementById("bundle_messenger");
1594 var title = gMessengerBundle.getString("openWindowWarningTitle");
1595 var text = gMessengerBundle.getFormattedString("openWindowWarningText", [numMessages]);
1596 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
1597 .getService(Components.interfaces.nsIPromptService);
1598 if (!promptService.confirm(window, title, text))
1599 return;
1600 }
1601
1602 for (var i = 0; i < numMessages; i++) {
1603 MsgOpenNewWindowForMessage(dbView.getURIForViewIndex(indices[i]), dbView.getFolderForViewIndex(indices[i]).URI);
1604 }
1605 }
1606
MsgOpenSelectedMessageInExistingWindow
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1607 function MsgOpenSelectedMessageInExistingWindow()
1608 {
1609 var windowID = GetWindowByWindowType("mail:messageWindow");
1610 if (!windowID)
1611 return false;
1612
1613 try {
1614 var messageURI = gDBView.URIForFirstSelectedMessage;
1615 var msgHdr = gDBView.hdrForFirstSelectedMessage;
1616
1617 // Reset the window's message uri and folder uri vars, and
1618 // update the command handlers to what's going to be used.
1619 // This has to be done before the call to CreateView().
1620 windowID.gCurrentMessageUri = messageURI;
1621 windowID.gCurrentFolderUri = msgHdr.folder.URI;
1622 windowID.UpdateMailToolbar('MsgOpenExistingWindowForMessage');
1623
1624 // even if the folder uri's match, we can't use the existing view
1625 // (msgHdr.folder.URI == windowID.gCurrentFolderUri)
1626 // the reason is quick search and mail views.
1627 // see bug #187673
1628 //
1629 // for the sake of simplicity,
1630 // let's always call CreateView(gDBView)
1631 // which will clone gDBView
1632 windowID.CreateView(gDBView);
1633 windowID.LoadMessageByMsgKey(msgHdr.messageKey);
1634
1635 // bring existing window to front
1636 windowID.focus();
1637 return true;
1638 }
1639 catch (ex) {
1640 dump("reusing existing standalone message window failed: " + ex + "\n");
1641 }
1642 return false;
1643 }
1644
1645 const nsIFilePicker = Components.interfaces.nsIFilePicker;
1646
MsgOpenFromFile
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1647 function MsgOpenFromFile()
1648 {
1649 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
1650
1651 var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].getService();
1652 strBundleService = strBundleService.QueryInterface(Components.interfaces.nsIStringBundleService);
1653 var extbundle = strBundleService.createBundle("chrome://messenger/locale/messenger.properties");
1654 var filterLabel = extbundle.GetStringFromName("EMLFiles");
1655 var windowTitle = extbundle.GetStringFromName("OpenEMLFiles");
1656
1657 fp.init(window, windowTitle, nsIFilePicker.modeOpen);
1658 fp.appendFilter(filterLabel, "*.eml");
1659
1660 // Default or last filter is "All Files"
1661 fp.appendFilters(nsIFilePicker.filterAll);
1662
1663 try {
1664 var ret = fp.show();
1665 if (ret == nsIFilePicker.returnCancel)
1666 return;
1667 }
1668 catch (ex) {
1669 dump("filePicker.chooseInputFile threw an exception\n");
1670 return;
1671 }
1672
1673 var uri = fp.fileURL.QueryInterface(Components.interfaces.nsIURL);
1674 uri.query = "type=application/x-message-display";
1675
1676 window.openDialog( "chrome://messenger/content/messageWindow.xul", "_blank", "all,chrome,dialog=no,status,toolbar", uri, null, null );
1677 }
1678
MsgOpenNewWindowForMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1679 function MsgOpenNewWindowForMessage(messageUri, folderUri)
1680 {
1681 if (!messageUri)
1682 // use GetFirstSelectedMessage() to find out which message to open
1683 // instead of gDBView.getURIForViewIndex(currentIndex). This is
1684 // required because on a right-click, the currentIndex value will be
1685 // different from the actual row that is highlighted.
1686 // GetFirstSelectedMessage() will return the message that is
1687 // highlighted.
1688 messageUri = GetFirstSelectedMessage();
1689
1690 if (!folderUri)
1691 // use GetSelectedFolderURI() to find out which message to open
1692 // instead of gDBView.getURIForViewIndex(currentIndex). This is
1693 // required because on a right-click, the currentIndex value will be
1694 // different from the actual row that is highlighted.
1695 // GetSelectedFolderURI() will return the message that is
1696 // highlighted.
1697 folderUri = GetSelectedFolderURI();
1698
1699 // be sure to pass in the current view....
1700 if (messageUri && folderUri) {
1701 window.openDialog( "chrome://messenger/content/messageWindow.xul", "_blank", "all,chrome,dialog=no,status,toolbar", messageUri, folderUri, gDBView );
1702 }
1703 }
1704
CloseMailWindow
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1705 function CloseMailWindow()
1706 {
1707 //dump("\nClose from XUL\nDo something...\n");
1708 window.close();
1709 }
1710
MsgJunk
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1711 function MsgJunk()
1712 {
1713 MsgJunkMailInfo(true);
1714 JunkSelectedMessages(!SelectedMessagesAreJunk());
1715 }
1716
MsgMarkMsgAsRead
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1717 function MsgMarkMsgAsRead(markRead)
1718 {
1719 if (!markRead) {
1720 markRead = !SelectedMessagesAreRead();
1721 }
1722 MarkSelectedMessagesRead(markRead);
1723 }
1724
MsgMarkAsFlagged
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1725 function MsgMarkAsFlagged(markFlagged)
1726 {
1727 if (!markFlagged) {
1728 markFlagged = !SelectedMessagesAreFlagged();
1729 }
1730 MarkSelectedMessagesFlagged(markFlagged);
1731 }
1732
MsgMarkReadByDate
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1733 function MsgMarkReadByDate()
1734 {
1735 window.openDialog( "chrome://messenger/content/markByDate.xul","",
1736 "chrome,modal,titlebar,centerscreen",
1737 GetLoadedMsgFolder() );
1738 }
1739
MsgMarkAllRead
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1740 function MsgMarkAllRead()
1741 {
1742 var folder = GetMsgFolderFromUri(GetSelectedFolderURI(), true);
1743
1744 if (folder)
1745 folder.markAllMessagesRead();
1746 }
1747
MsgDownloadFlagged
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1748 function MsgDownloadFlagged()
1749 {
1750 gDBView.doCommand(nsMsgViewCommandType.downloadFlaggedForOffline);
1751 }
1752
MsgDownloadSelected
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1753 function MsgDownloadSelected()
1754 {
1755 gDBView.doCommand(nsMsgViewCommandType.downloadSelectedForOffline);
1756 }
1757
MsgMarkThreadAsRead
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1758 function MsgMarkThreadAsRead()
1759 {
1760 ClearPendingReadTimer();
1761 gDBView.doCommand(nsMsgViewCommandType.markThreadRead);
1762 }
1763
MsgViewPageSource
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1764 function MsgViewPageSource()
1765 {
1766 var messages = GetSelectedMessages();
1767 ViewPageSource(messages);
1768 }
1769
MsgFind
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1770 function MsgFind()
1771 {
1772 document.getElementById("FindToolbar").onFindCommand();
1773 }
1774
MsgFindAgain
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1775 function MsgFindAgain(reverse)
1776 {
1777 document.getElementById("FindToolbar").onFindAgainCommand(reverse);
1778 }
1779
MsgFilters
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1780 function MsgFilters(emailAddress, folder)
1781 {
1782 if (!folder)
1783 {
1784 // try to determine the folder from the selected message.
1785 if (gDBView)
1786 {
1787 try
1788 {
1789 var msgHdr = gDBView.hdrForFirstSelectedMessage;
1790 var accountKey = msgHdr.accountKey;
1791 if (accountKey.length > 0)
1792 {
1793 var account = accountManager.getAccount(accountKey);
1794 if (account)
1795 {
1796 var server = account.incomingServer;
1797 if (server)
1798 folder = server.rootFolder;
1799 }
1800 }
1801 }
1802 catch (ex) {}
1803 }
1804 if (!folder)
1805 {
1806 folder = GetFirstSelectedMsgFolder();
1807 // if this is the local folders account, check if the default account
1808 // defers to it; if so, we'll use the default account so the simple case
1809 // of one pop3 account with the global inbox creates filters for the right server.
1810 if (folder && folder.server.type == "none" && folder.server.isDeferredTo)
1811 {
1812 var defaultServer = accountManager.defaultAccount.incomingServer;
1813 if (defaultServer.rootMsgFolder == folder.server.rootFolder)
1814 folder = defaultServer.rootFolder;
1815 }
1816 }
1817
1818 }
1819 var args;
1820 if (emailAddress)
1821 {
1822 /* we have to do prefill filter so we are going to
1823 launch the filterEditor dialog
1824 and prefill that with the emailAddress */
1825
1826 var curFilterList = folder.getFilterList(msgWindow);
1827 args = {filterList: curFilterList};
1828 args.filterName = emailAddress;
1829 window.openDialog("chrome://messenger/content/FilterEditor.xul", "",
1830 "chrome, modal, resizable,centerscreen,dialog=yes", args);
1831
1832 /* if the user hits ok in the filterEditor dialog we set
1833 args.refresh=true there
1834 we check this here in args to show filterList dialog */
1835 if ("refresh" in args && args.refresh)
1836 {
1837 args = { refresh: true, folder: folder };
1838 MsgFilterList(args);
1839 }
1840 }
1841 else // just launch filterList dialog
1842 {
1843 args = { refresh: false, folder: folder };
1844 MsgFilterList(args);
1845 }
1846 }
1847
MsgApplyFilters
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1848 function MsgApplyFilters()
1849 {
1850 var filterService = Components.classes["@mozilla.org/messenger/services/filters;1"].getService(Components.interfaces.nsIMsgFilterService);
1851
1852 var preselectedFolder = GetFirstSelectedMsgFolder();
1853 var selectedFolders = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
1854 selectedFolders.AppendElement(preselectedFolder);
1855
1856 var curFilterList = preselectedFolder.getFilterList(msgWindow);
1857 // create a new filter list and copy over the enabled filters to it.
1858 // We do this instead of having the filter after the fact code ignore
1859 // disabled filters because the Filter Dialog filter after the fact
1860 // code would have to clone filters to allow disabled filters to run,
1861 // and we don't support cloning filters currently.
1862 var tempFilterList = filterService.getTempFilterList(preselectedFolder);
1863 var numFilters = curFilterList.filterCount;
1864 // make sure the temp filter list uses the same log stream
1865 tempFilterList.logStream = curFilterList.logStream;
1866 tempFilterList.loggingEnabled = curFilterList.loggingEnabled;
1867 var newFilterIndex = 0;
1868 for (var i = 0; i < numFilters; i++)
1869 {
1870 var curFilter = curFilterList.getFilterAt(i);
1871 if (curFilter.enabled && !curFilter.temporary) // only add enabled, UI visibile filters
1872 {
1873 tempFilterList.insertFilterAt(newFilterIndex, curFilter);
1874 newFilterIndex++;
1875 }
1876 }
1877 filterService.applyFiltersToFolders(tempFilterList, selectedFolders, msgWindow);
1878 }
1879
ChangeMailLayout
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1880 function ChangeMailLayout(newLayout)
1881 {
1882 gPrefBranch.setIntPref("mail.pane_config.dynamic", newLayout);
1883 }
1884
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1885 function MsgViewAllHeaders()
1886 {
1887 gPrefBranch.setIntPref("mail.show_headers",2);
1888 MsgReload();
1889 return true;
1890 }
1891
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1892 function MsgViewNormalHeaders()
1893 {
1894 gPrefBranch.setIntPref("mail.show_headers",1);
1895 MsgReload();
1896 return true;
1897 }
1898
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1899 function MsgViewBriefHeaders()
1900 {
1901 gPrefBranch.setIntPref("mail.show_headers",0);
1902 MsgReload();
1903 return true;
1904 }
1905
MsgBodyAllowHTML
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1906 function MsgBodyAllowHTML()
1907 {
1908 gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", false);
1909 gPrefBranch.setIntPref("mailnews.display.html_as", 0);
1910 gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers", 0);
1911 MsgReload();
1912 return true;
1913 }
1914
MsgBodySanitized
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1915 function MsgBodySanitized()
1916 {
1917 gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", false);
1918 gPrefBranch.setIntPref("mailnews.display.html_as", 3);
1919 gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers",
1920 gDisallow_classes_no_html);
1921 MsgReload();
1922 return true;
1923 }
1924
MsgBodyAsPlaintext
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1925 function MsgBodyAsPlaintext()
1926 {
1927 gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", true);
1928 gPrefBranch.setIntPref("mailnews.display.html_as", 1);
1929 gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers", gDisallow_classes_no_html);
1930 MsgReload();
1931 return true;
1932 }
1933
ToggleInlineAttachment
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1934 function ToggleInlineAttachment(target)
1935 {
1936 var viewAttachmentInline = !pref.getBoolPref("mail.inline_attachments");
1937 pref.setBoolPref("mail.inline_attachments", viewAttachmentInline)
1938 target.setAttribute("checked", viewAttachmentInline ? "true" : "false");
1939 MsgReload();
1940 }
1941
MsgReload
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1942 function MsgReload()
1943 {
1944 ReloadMessage();
1945 }
1946
MsgStop
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1947 function MsgStop()
1948 {
1949 StopUrls();
1950 }
1951
MsgSendUnsentMsgs
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1952 function MsgSendUnsentMsgs()
1953 {
1954 // if offline, prompt for sendUnsentMessages
1955 if (MailOfflineMgr.isOnline())
1956 SendUnsentMessages();
1957 else
1958 MailOfflineMgr.goOnlineToSendMessages(msgWindow);
1959 }
1960
PrintEnginePrintInternal
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1961 function PrintEnginePrintInternal(messageList, numMessages, doPrintPreview, msgType)
1962 {
1963 if (numMessages == 0) {
1964 dump("PrintEnginePrint(): No messages selected.\n");
1965 return false;
1966 }
1967
1968 gPrintSettings = PrintUtils.getPrintSettings();
1969 printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
1970 "",
1971 "chrome,dialog=no,all,centerscreen",
1972 numMessages, messageList, statusFeedback, gPrintSettings, doPrintPreview, msgType, window);
1973 return true;
1974
1975 }
1976
PrintEnginePrint
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1977 function PrintEnginePrint()
1978 {
1979 var messageList = GetSelectedMessages();
1980 return PrintEnginePrintInternal(messageList, messageList.length, false, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINT_MSG);
1981 }
1982
PrintEnginePrintPreview
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1983 function PrintEnginePrintPreview()
1984 {
1985 var messageList = GetSelectedMessages();
1986 return PrintEnginePrintInternal(messageList, 1, true, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINTPREVIEW_MSG);
1987 }
1988
IsMailFolderSelected
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1989 function IsMailFolderSelected()
1990 {
1991 var selectedFolders = GetSelectedMsgFolders();
1992 var numFolders = selectedFolders.length;
1993 if(numFolders !=1)
1994 return false;
1995
1996 var folder = selectedFolders[0];
1997 if (!folder)
1998 return false;
1999
2000 var server = folder.server;
2001 var serverType = server.type;
2002
2003 if((serverType == "nntp"))
2004 return false;
2005 else return true;
2006 }
2007
IsGetNewMessagesEnabled
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2008 function IsGetNewMessagesEnabled()
2009 {
2010 // users don't like it when the "Get Msgs" button is disabled
2011 // so let's never do that.
2012 // we'll just handle it as best we can in GetFolderMessages()
2013 // when they click "Get Msgs" and
2014 // Local Folders or a news server is selected
2015 // see bugs #89404 and #111102
2016 return true;
2017 }
2018
IsGetNextNMessagesEnabled
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2019 function IsGetNextNMessagesEnabled()
2020 {
2021 var selectedFolders = GetSelectedMsgFolders();
2022 var numFolders = selectedFolders.length;
2023 if(numFolders !=1)
2024 return false;
2025
2026 var folder = selectedFolders[0];
2027 if (!folder)
2028 return false;
2029
2030 var server = folder.server;
2031 var serverType = server.type;
2032
2033 var menuItem = document.getElementById("menu_getnextnmsg");
2034 if ((serverType == "nntp") && !folder.isServer) {
2035 var newsServer = server.QueryInterface(Components.interfaces.nsINntpIncomingServer);
2036 var menuLabel = gMessengerBundle.getFormattedString("getNextNMessages",
2037 [ newsServer.maxArticles ]);
2038 menuItem.setAttribute("label",menuLabel);
2039 menuItem.removeAttribute("hidden");
2040 return true;
2041 }
2042
2043 menuItem.setAttribute("hidden","true");
2044 return false;
2045 }
2046
IsEmptyTrashEnabled
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2047 function IsEmptyTrashEnabled()
2048 {
2049 var folderURI = GetSelectedFolderURI();
2050 var server = GetServer(folderURI);
2051 return (server && server.canEmptyTrashOnExit?IsMailFolderSelected():false);
2052 }
2053
IsCompactFolderEnabled
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2054 function IsCompactFolderEnabled()
2055 {
2056 var server = GetServer(GetSelectedFolderURI());
2057 return (server &&
2058 ((server.type != 'imap') || server.canCompactFoldersOnServer) &&
2059 isCommandEnabled("cmd_compactFolder")); // checks e.g. if IMAP is offline
2060 }
2061
2062 var gDeleteButton = null;
2063 var gMarkButton = null;
2064
SetUpToolbarButtons
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2065 function SetUpToolbarButtons(uri)
2066 {
2067 //dump("SetUpToolbarButtons("+uri+")\n");
2068
2069 // eventually, we might want to set up the toolbar differently for imap,
2070 // pop, and news. for now, just tweak it based on if it is news or not.
2071 var forNews = isNewsURI(uri);
2072
2073 if(!gDeleteButton) gDeleteButton = document.getElementById("button-delete");
2074
2075 var buttonToHide = null;
2076 var buttonToShow = null;
2077
2078 if (forNews) {
2079 buttonToHide = gDeleteButton;
2080 }
2081 else {
2082 buttonToShow = gDeleteButton;
2083 }
2084
2085 if (buttonToHide) {
2086 buttonToHide.setAttribute('hidden',true);
2087 }
2088 if (buttonToShow) {
2089 buttonToShow.removeAttribute('hidden');
2090 }
2091 }
2092
2093 var gMessageBrowser;
2094
getMessageBrowser
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2095 function getMessageBrowser()
2096 {
2097 if (!gMessageBrowser)
2098 gMessageBrowser = document.getElementById("messagepane");
2099
2100 return gMessageBrowser;
2101 }
2102
getMarkupDocumentViewer
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2103 function getMarkupDocumentViewer()
2104 {
2105 return getMessageBrowser().markupDocumentViewer;
2106 }
2107
MsgSynchronizeOffline
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2108 function MsgSynchronizeOffline()
2109 {
2110 window.openDialog("chrome://messenger/content/msgSynchronize.xul",
2111 "", "centerscreen,chrome,modal,titlebar,resizable=yes",{msgWindow:msgWindow});
2112 }
2113
SpaceHit
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2114 function SpaceHit(event)
2115 {
2116 var contentWindow = window.top._content;
2117 var rssiframe = contentWindow.document.getElementById('_mailrssiframe');
2118
2119 // if we are displaying an RSS article, we really want to scroll the nested iframe
2120 if (rssiframe)
2121 contentWindow = rssiframe.contentWindow;
2122
2123 if (event && event.shiftKey) {
2124 // if at the start of the message, go to the previous one
2125 if (contentWindow.scrollY > 0) {
2126 contentWindow.scrollByPages(-1);
2127 }
2128 else {
2129 goDoCommand("cmd_previousUnreadMsg");
2130 }
2131 }
2132 else {
2133 // if at the end of the message, go to the next one
2134 if (contentWindow.scrollY < contentWindow.scrollMaxY) {
2135 contentWindow.scrollByPages(1);
2136 }
2137 else {
2138 goDoCommand("cmd_nextUnreadMsg");
2139 }
2140 }
2141 }
2142
IsAccountOfflineEnabled
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2143 function IsAccountOfflineEnabled()
2144 {
2145 var selectedFolders = GetSelectedMsgFolders();
2146
2147 if (selectedFolders && (selectedFolders.length == 1))
2148 return selectedFolders[0].supportsOffline;
2149
2150 return false;
2151 }
2152
GetDefaultAccountRootFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2153 function GetDefaultAccountRootFolder()
2154 {
2155 try {
2156 var account = accountManager.defaultAccount;
2157 var defaultServer = account.incomingServer;
2158 var defaultFolder = defaultServer.rootMsgFolder;
2159 return defaultFolder;
2160 }
2161 catch (ex) {
2162 }
2163 return null;
2164 }
2165
GetFolderMessages
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2166 function GetFolderMessages()
2167 {
2168 var selectedFolders = GetSelectedMsgFolders();
2169 var defaultAccountRootFolder = GetDefaultAccountRootFolder();
2170
2171 // if no default account, get msg isn't going do anything anyways
2172 // so bail out
2173 if (!defaultAccountRootFolder)
2174 return;
2175
2176 // if nothing selected, use the default
2177 var folder = selectedFolders.length ? selectedFolders[0] : defaultAccountRootFolder;
2178
2179 var serverType = folder.server.type;
2180
2181 if (folder.isServer && (serverType == "nntp")) {
2182 // if we're doing "get msgs" on a news server
2183 // update unread counts on this server
2184 folder.server.performExpand(msgWindow);
2185 return;
2186 }
2187 else if (serverType == "none") {
2188 // if "Local Folders" is selected
2189 // and the user does "Get Msgs"
2190 // and LocalFolders is not deferred to,
2191 // get new mail for the default account
2192 //
2193 // XXX TODO
2194 // should shift click get mail for all (authenticated) accounts?
2195 // see bug #125885
2196 if (!folder.server.isDeferredTo)
2197 folder = defaultAccountRootFolder;
2198 }
2199
2200 var folders = new Array(1);
2201 folders[0] = folder;
2202
2203 GetNewMessages(folders, folder.server);
2204 }
2205
SendUnsentMessages
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2206 function SendUnsentMessages()
2207 {
2208 var msgSendlater = Components.classes["@mozilla.org/messengercompose/sendlater;1"]
2209 .getService(Components.interfaces.nsIMsgSendLater);
2210 var identitiesCount, allIdentities, currentIdentity, numMessages, msgFolder;
2211
2212 if (accountManager) {
2213 allIdentities = accountManager.allIdentities;
2214 identitiesCount = allIdentities.Count();
2215 for (var i = 0; i < identitiesCount; i++) {
2216 currentIdentity = allIdentities.QueryElementAt(i, Components.interfaces.nsIMsgIdentity);
2217 msgFolder = msgSendlater.getUnsentMessagesFolder(currentIdentity);
2218 if(msgFolder) {
2219 numMessages = msgFolder.getTotalMessages(false /* include subfolders */);
2220 if(numMessages > 0) {
2221 messenger.sendUnsentMessages(currentIdentity, msgWindow);
2222 // right now, all identities point to the same unsent messages
2223 // folder, so to avoid sending multiple copies of the
2224 // unsent messages, we only call messenger.SendUnsentMessages() once
2225 // see bug #89150 for details
2226 break;
2227 }
2228 }
2229 }
2230 }
2231 }
2232
CoalesceGetMsgsForPop3ServersByDestFolder
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2233 function CoalesceGetMsgsForPop3ServersByDestFolder(currentServer, pop3DownloadServersArray, localFoldersToDownloadTo)
2234 {
2235 var outNumFolders = new Object();
2236 var inboxFolder = currentServer.rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders);
2237 // coalesce the servers that download into the same folder...
2238 var index = localFoldersToDownloadTo.GetIndexOf(inboxFolder);
2239 if (index == -1)
2240 {
2241 if(inboxFolder)
2242 {
2243 inboxFolder.biffState = Components.interfaces.nsIMsgFolder.nsMsgBiffState_NoMail;
2244 inboxFolder.clearNewMessages();
2245 }
2246 localFoldersToDownloadTo.AppendElement(inboxFolder);
2247 index = pop3DownloadServersArray.length
2248 pop3DownloadServersArray[index] = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
2249 }
2250 pop3DownloadServersArray[index].AppendElement(currentServer);
2251 }
2252
GetMessagesForAllAuthenticatedAccounts
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2253 function GetMessagesForAllAuthenticatedAccounts()
2254 {
2255 // now log into any server
2256 try
2257 {
2258 var allServers = accountManager.allServers;
2259 var i;
2260 // array of isupportsarrays of servers for a particular folder
2261 var pop3DownloadServersArray = new Array();
2262 // parallel isupports array of folders to download to...
2263 var localFoldersToDownloadTo = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
2264 var pop3Server;
2265
2266 for (i = 0; i < allServers.Count(); ++i)
2267 {
2268 var currentServer = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
2269 var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + currentServer.type].getService(Components.interfaces.nsIMsgProtocolInfo);
2270 if (protocolinfo.canGetMessages && !currentServer.passwordPromptRequired)
2271 {
2272 if (currentServer.type == "pop3")
2273 {
2274 CoalesceGetMsgsForPop3ServersByDestFolder(currentServer, pop3DownloadServersArray, localFoldersToDownloadTo);
2275 pop3Server = currentServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer);
2276 }
2277 else
2278 // get new messages on the server for imap or rss
2279 GetMessagesForInboxOnServer(currentServer);
2280 }
2281 }
2282 for (i = 0; i < pop3DownloadServersArray.length; ++i)
2283 {
2284 // any ol' pop3Server will do - the serversArray specifies which servers to download from
2285 pop3Server.downloadMailFromServers(pop3DownloadServersArray[i], msgWindow, localFoldersToDownloadTo.GetElementAt(i), null);
2286 }
2287 }
2288 catch(ex)
2289 {
2290 dump(ex + "\n");
2291 }
2292 }
2293
CommandUpdate_UndoRedo
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2294 function CommandUpdate_UndoRedo()
2295 {
2296 ShowMenuItem("menu_undo", true);
2297 EnableMenuItem("menu_undo", SetupUndoRedoCommand("cmd_undo"));
2298 ShowMenuItem("menu_redo", true);
2299 EnableMenuItem("menu_redo", SetupUndoRedoCommand("cmd_redo"));
2300 }
2301
SetupUndoRedoCommand
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2302 function SetupUndoRedoCommand(command)
2303 {
2304 var loadedFolder = GetLoadedMsgFolder();
2305
2306 // if we have selected a server, and are viewing account central
2307 // there is no loaded folder
2308 if (!loadedFolder)
2309 return false;
2310
2311 var server = loadedFolder.server;
2312 if (!(server.canUndoDeleteOnServer))
2313 return false;
2314
2315 var canUndoOrRedo = false;
2316 var txnType = 0;
2317
2318 if (command == "cmd_undo")
2319 {
2320 canUndoOrRedo = messenger.canUndo();
2321 txnType = messenger.getUndoTransactionType();
2322 }
2323 else
2324 {
2325 canUndoOrRedo = messenger.canRedo();
2326 txnType = messenger.getRedoTransactionType();
2327 }
2328
2329 if (canUndoOrRedo)
2330 {
2331 switch (txnType)
2332 {
2333 default:
2334 case 0:
2335 goSetMenuValue(command, 'valueDefault');
2336 break;
2337 case 1:
2338 goSetMenuValue(command, 'valueDeleteMsg');
2339 break;
2340 case 2:
2341 goSetMenuValue(command, 'valueMoveMsg');
2342 break;
2343 case 3:
2344 goSetMenuValue(command, 'valueCopyMsg');
2345 break;
2346 }
2347 }
2348 else
2349 {
2350 goSetMenuValue(command, 'valueDefault');
2351 }
2352 return canUndoOrRedo;
2353 }
2354
HandleJunkStatusChanged
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2355 function HandleJunkStatusChanged(folder)
2356 {
2357 // this might be the stand alone window, open to a message that was
2358 // and attachment (or on disk), in which case, we want to ignore it.
2359 var loadedMessage = GetLoadedMessage();
2360 if (loadedMessage && (!(/type=application\/x-message-display/.test(loadedMessage))) && IsCurrentLoadedFolder(folder))
2361 {
2362 // if multiple message are selected and we change the junk status
2363 // we don't want to show the junk bar (since the message pane is blank)
2364 var msgHdr = null;
2365 if (GetNumSelectedMessages() == 1)
2366 msgHdr = messenger.msgHdrFromURI(loadedMessage);
2367 var junkBarWasDisplayed = gMessageNotificationBar.isFlagSet(kMsgNotificationJunkBar);
2368 gMessageNotificationBar.setJunkMsg(msgHdr);
2369
2370 // only reload message if junk bar display state has changed.
2371 if (msgHdr && junkBarWasDisplayed != gMessageNotificationBar.isFlagSet(kMsgNotificationJunkBar))
2372 {
2373 // we may be forcing junk mail to be rendered with sanitized html. In that scenario, we want to
2374 // reload the message if the status has just changed to not junk.
2375 var sanitizeJunkMail = gPrefBranch.getBoolPref("mail.spam.display.sanitize");
2376 if (sanitizeJunkMail) // only bother doing this if we are modifying the html for junk mail....
2377 {
2378 var moveJunkMail = (folder && folder.server && folder.server.spamSettings) ?
2379 folder.server.spamSettings.manualMark : false;
2380
2381 var junkScore = msgHdr.getStringProperty("junkscore");
2382 var isJunk = ((junkScore != "") && (junkScore != "0"));
2383
2384 // we used to only reload the message if we were toggling the message to NOT JUNK from junk
2385 // but it can be useful to see the HTML in the message get converted to sanitized form when a message
2386 // is marked as junk.
2387 // Furthermore, if we are about to move the message that was just marked as junk,
2388 // then don't bother reloading it.
2389 if (!(isJunk && moveJunkMail))
2390 MsgReload();
2391 }
2392 }
2393 }
2394 }
2395
2396 var gMessageNotificationBar =
2397 {
2398 mBarStatus: 0,
2399 // flag bit values for mBarStatus, indexed by kMsgNotificationXXX
2400 mBarFlagValues: [
2401 0, // for no msgNotificationBar
2402 1, // 1 << (kMsgNotificationPhishingBar - 1)
2403 2, // 1 << (kMsgNotificationJunkBar - 1)
2404 4 // 1 << (kMsgNotificationRemoteImages - 1)
2405 ],
2406
2407 mMsgNotificationBar: document.getElementById('msgNotificationBar'),
2408
setJunkMsg
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2409 setJunkMsg: function(aMsgHdr)
2410 {
2411 var isJunk = false;
2412
2413 if (aMsgHdr)
2414 {
2415 var junkScore = aMsgHdr.getStringProperty("junkscore");
2416 isJunk = ((junkScore != "") && (junkScore != "0"));
2417 }
2418
2419 this.updateMsgNotificationBar(kMsgNotificationJunkBar, isJunk);
2420
2421 goUpdateCommand('button_junk');
2422 },
2423
setRemoteContentMsg
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2424 setRemoteContentMsg: function(aMsgHdr)
2425 {
2426 // update the allow remote content for sender string
2427 var headerParser = Components.classes["@mozilla.org/messenger/headerparser;1"].getService(Components.interfaces.nsIMsgHeaderParser);
2428 var emailAddress = headerParser.extractHeaderAddressMailboxes(null, aMsgHdr.author);
2429 document.getElementById('allowRemoteContentForAuthorDesc').value =
2430 gMessengerBundle.getFormattedString('alwaysLoadRemoteContentForSender1', [emailAddress ? emailAddress : aMsgHdr.author]);
2431 this.updateMsgNotificationBar(kMsgNotificationRemoteImages, true);
2432 },
2433
setPhishingMsg
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2434 setPhishingMsg: function()
2435 {
2436 this.updateMsgNotificationBar(kMsgNotificationPhishingBar, true);
2437 },
2438
clearMsgNotifications
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2439 clearMsgNotifications: function()
2440 {
2441 this.mBarStatus = 0;
2442 this.mMsgNotificationBar.selectedIndex = 0;
2443 this.mMsgNotificationBar.collapsed = true;
2444 },
2445
updateMsgNotificationBar
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2446 updateMsgNotificationBar: function(aIndex, aSet)
2447 {
2448 var chunk = this.mBarFlagValues[aIndex];
2449 var status = aSet ? this.mBarStatus | chunk : this.mBarStatus & ~chunk;
2450 this.mBarStatus = status;
2451
2452 // the phishing message takes precedence over the junk message
2453 // which takes precedence over the remote content message
2454 this.mMsgNotificationBar.selectedIndex = this.mBarFlagValues.indexOf(status & -status);
2455 this.mMsgNotificationBar.collapsed = !status;
2456 },
2457
2458 /**
2459 * @param aFlag (kMsgNotificationPhishingBar, kMsgNotificationJunkBar, kMsgNotificationRemoteImages
2460 * @return true if aFlag is currently set for the loaded message
2461 */
isFlagSet
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2462 isFlagSet: function(aFlag)
2463 {
2464 var chunk = this.mBarFlagValues[aFlag];
2465 return this.mBarStatus & chunk;
2466 }
2467 };
2468
2469 /**
2470 * LoadMsgWithRemoteContent
2471 * Reload the current message, allowing remote content
2472 */
LoadMsgWithRemoteContent
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2473 function LoadMsgWithRemoteContent()
2474 {
2475 // we want to get the msg hdr for the currently selected message
2476 // change the "remoteContentBar" property on it
2477 // then reload the message
2478
2479 setMsgHdrPropertyAndReload("remoteContentPolicy", kAllowRemoteContent);
2480 }
2481
2482 /**
2483 * msgHdrForCurrentMessage
2484 * Returns the msg hdr associated with the current loaded message.
2485 */
msgHdrForCurrentMessage
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2486 function msgHdrForCurrentMessage()
2487 {
2488 var msgURI = GetLoadedMessage();
2489 return (msgURI && !(/type=application\/x-message-display/.test(msgURI))) ? messenger.msgHdrFromURI(msgURI) : null;
2490 }
2491
2492 /**
2493 * Reloads the message after adjusting the remote content policy for the sender.
2494 * Iterate through the local address books looking for a card with the same e-mail address as the
2495 * sender of the current loaded message. If we find a card, update the allow remote content field.
2496 * If we can't find a card, prompt the user with a new AB card dialog, pre-selecting the remote content field.
2497 */
allowRemoteContentForSender
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2498 function allowRemoteContentForSender()
2499 {
2500 // get the sender of the msg hdr
2501 var msgHdr = msgHdrForCurrentMessage();
2502 if (!msgHdr)
2503 return;
2504
2505 var headerParser = Components.classes["@mozilla.org/messenger/headerparser;1"]
2506 .getService(Components.interfaces.nsIMsgHeaderParser);
2507 var names = {};
2508 var addresses = {};
2509 var fullNames = {};
2510 var numAddresses;
2511
2512 numAddresses = headerParser.parseHeadersWithArray(msgHdr.author, addresses, names, fullNames);
2513 var authorEmailAddress = addresses.value[0];
2514 if (!authorEmailAddress)
2515 return;
2516
2517 // search through all of our local address books looking for a match.
2518 var enumerator = Components.classes["@mozilla.org/abmanager;1"]
2519 .getService(Components.interfaces.nsIAbManager)
2520 .directories;
2521 var cardForEmailAddress;
2522 var addrbook;
2523 while (!cardForEmailAddress && enumerator.hasMoreElements())
2524 {
2525 addrbook = enumerator.getNext();
2526 if (addrbook instanceof Components.interfaces.nsIAbMDBDirectory)
2527 cardForEmailAddress = addrbook.cardForEmailAddress(authorEmailAddress);
2528 }
2529
2530 var allowRemoteContent = false;
2531 if (cardForEmailAddress && addrbook instanceof Components.interfaces.nsIAbDirectory)
2532 {
2533 // set the property for remote content
2534 cardForEmailAddress.allowRemoteContent = true;
2535 addrbook.modifyCard(cardForEmailAddress);
2536 allowRemoteContent = true;
2537 }
2538 else
2539 {
2540 var args = {primaryEmail:authorEmailAddress, displayName:names.value[0],
2541 allowRemoteContent:true};
2542 // create a new card and set the property
2543 window.openDialog("chrome://messenger/content/addressbook/abNewCardDialog.xul",
2544 "", "chrome,resizable=no,titlebar,modal,centerscreen", args);
2545 allowRemoteContent = args.allowRemoteContent;
2546 }
2547
2548 // reload the message if we've updated the remote content policy for the sender
2549 if (allowRemoteContent)
2550 MsgReload();
2551 }
2552
2553 /**
2554 * IgnorePhishingWarning - set the msg hdr flag to ignore the phishing warning
2555 * and reload the message.
2556 */
IgnorePhishingWarning
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2557 function IgnorePhishingWarning()
2558 {
2559 // this property should really be called skipPhishingWarning or something like that, but it's too late to change that now. This property is used to supress the phishing
2560 // bar for the message.
2561 setMsgHdrPropertyAndReload("notAPhishMessage", 1);
2562 }
2563
setMsgHdrPropertyAndReload
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2564 function setMsgHdrPropertyAndReload(aProperty, aValue)
2565 {
2566 // we want to get the msg hdr for the currently selected message
2567 // change the appropiate property on it then reload the message
2568 var msgHdr = msgHdrForCurrentMessage();
2569 if (msgHdr)
2570 {
2571 msgHdr.setUint32Property(aProperty, aValue);
2572 MsgReload();
2573 }
2574 }
2575
checkMsgHdrPropertyIsNot
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2576 function checkMsgHdrPropertyIsNot(aProperty, aValue)
2577 {
2578 // we want to get the msg hdr for the currently selected message,
2579 // get the appropiate property on it and then test against value.
2580 var msgHdr = msgHdrForCurrentMessage();
2581 return (msgHdr && msgHdr.getUint32Property(aProperty) != aValue);
2582 }
2583
MarkCurrentMessageAsRead
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2584 function MarkCurrentMessageAsRead()
2585 {
2586 ClearPendingReadTimer();
2587 gDBView.doCommand(nsMsgViewCommandType.markMessagesRead);
2588 }
2589
ClearPendingReadTimer
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2590 function ClearPendingReadTimer()
2591 {
2592 if (gMarkViewedMessageAsReadTimer)
2593 {
2594 clearTimeout(gMarkViewedMessageAsReadTimer);
2595 gMarkViewedMessageAsReadTimer = null;
2596 }
2597 }
2598
2599 // this is called when layout is actually finished rendering a
2600 // mail message. OnMsgLoaded is called when libmime is done parsing the message
OnMsgParsed
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2601 function OnMsgParsed(aUrl)
2602 {
2603 // browser doesn't do this, but I thought it could be a useful thing to test out...
2604 // If the find bar is visible and we just loaded a new message, re-run
2605 // the find command. This means the new message will get highlighted and
2606 // we'll scroll to the first word in the message that matches the find text.
2607 var findBar = document.getElementById("FindToolbar");
2608 if (!findBar.hidden)
2609 findBar.onFindAgainCommand(false);
2610
2611 // run the phishing detector on the message
2612 var msgHdr = msgHdrForCurrentMessage();
2613 if (msgHdr.getUint32Property("notAPhishMessage"))
2614 gPhishingDetector.analyzeMsgForPhishingURLs(aUrl);
2615
2616 // notify anyone (e.g., extensions) who's interested in when a message is loaded.
2617 var msgURI = GetLoadedMessage();
2618 var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
2619 observerService.notifyObservers(msgWindow.msgHeaderSink, "MsgMsgDisplayed", msgURI);
2620
2621 // scale any overflowing images
2622 var doc = getMessageBrowser().contentDocument;
2623 var imgs = doc.getElementsByTagName("img");
2624 for each (var img in imgs)
2625 {
2626 if (img.className == "moz-attached-image" && img.naturalWidth > doc.width)
2627 {
2628 if (img.hasAttribute("shrinktofit"))
2629 img.setAttribute("isshrunk", "true");
2630 else
2631 img.setAttribute("overflowing", "true");
2632 }
2633 }
2634 }
2635
OnMsgLoaded
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2636 function OnMsgLoaded(aUrl)
2637 {
2638 if (!aUrl)
2639 return;
2640
2641 // nsIMsgMailNewsUrl.folder throws an error when opening .eml files.
2642 var folder;
2643 try {
2644 folder = aUrl.folder;
2645 }
2646 catch (ex) {}
2647
2648 var msgURI = GetLoadedMessage();
2649
2650 if (!folder || !msgURI)
2651 return;
2652
2653 // If we are in the middle of a delete or move operation, make sure that
2654 // if the user clicks on another message then that message stays selected
2655 // and the selection does not "snap back" to the message chosen by
2656 // SetNextMessageAfterDelete() when the operation completes (bug 243532).
2657 // But the just loaded message might be getting deleted, if the user
2658 // deletes it before the message is loaded (bug 183394)
2659 var wintype = document.documentElement.getAttribute('windowtype');
2660 if (wintype == "mail:messageWindow" || GetThreadTree().view.selection.currentIndex != gSelectedIndexWhenDeleting)
2661 gNextMessageViewIndexAfterDelete = -2;
2662
2663 var msgHdr = msgHdrForCurrentMessage();
2664
2665 gMessageNotificationBar.setJunkMsg(msgHdr);
2666
2667 // we just finished loading a message. set a timer to actually mark the message is read after n seconds
2668 // where n can be configured by the user.
2669
2670 var markReadOnADelay = gPrefBranch.getBoolPref("mailnews.mark_message_read.delay");
2671
2672 if (msgHdr && !msgHdr.isRead)
2673 {
2674 if (markReadOnADelay && wintype == "mail:3pane") // only use the timer if viewing using the 3-pane preview pane and the user has set the pref
2675 {
2676 ClearPendingReadTimer();
2677 gMarkViewedMessageAsReadTimer = setTimeout(MarkCurrentMessageAsRead, gPrefBranch.getIntPref("mailnews.mark_message_read.delay.interval") * 1000);
2678 }
2679 else
2680 MarkCurrentMessageAsRead();
2681 }
2682
2683 // See if MDN was requested but has not been sent.
2684 HandleMDNResponse(aUrl);
2685
2686 var currentMsgFolder = folder.QueryInterface(Components.interfaces.nsIMsgFolder);
2687 if (!IsImapMessage(msgURI))
2688 return;
2689
2690 var imapServer = currentMsgFolder.server.QueryInterface(Components.interfaces.nsIImapIncomingServer);
2691 var storeReadMailInPFC = imapServer.storeReadMailInPFC;
2692 if (storeReadMailInPFC)
2693 {
2694 var messageID;
2695
2696 var copyToOfflineFolder = true;
2697
2698 // look in read mail PFC for msg with same msg id - if we find one,
2699 // don't put this message in the read mail pfc.
2700 var outputPFC = imapServer.GetReadMailPFC(true);
2701
2702 if (msgHdr)
2703 {
2704 messageID = msgHdr.messageId;
2705 if (messageID.length > 0)
2706 {
2707 var readMailDB = outputPFC.getMsgDatabase(msgWindow);
2708 if (readMailDB)
2709 {
2710 var hdrInDestDB = readMailDB.getMsgHdrForMessageID(messageID);
2711 if (hdrInDestDB)
2712 copyToOfflineFolder = false;
2713 }
2714 }
2715 }
2716 if (copyToOfflineFolder)
2717 {
2718 var messages = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
2719 messages.AppendElement(msgHdr);
2720
2721 res = outputPFC.copyMessages(currentMsgFolder, messages, false /*isMove*/, msgWindow /* nsIMsgWindow */, null /* listener */, false /* isFolder */, false /*allowUndo*/ );
2722 }
2723 }
2724 }
2725
2726 //
2727 // This function handles all mdn response generation (ie, imap and pop).
2728 // For pop the msg uid can be 0 (ie, 1st msg in a local folder) so no
2729 // need to check uid here. No one seems to set mimeHeaders to null so
2730 // no need to check it either.
2731 //
HandleMDNResponse
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2732 function HandleMDNResponse(aUrl)
2733 {
2734 if (!aUrl)
2735 return;
2736
2737 var msgFolder = aUrl.folder;
2738 var msgURI = GetLoadedMessage();
2739 if (!msgFolder || !msgURI || IsNewsMessage(msgURI))
2740 return;
2741
2742 // if the message is marked as junk, do NOT attempt to process a return receipt
2743 // in order to better protect the user
2744 if (SelectedMessagesAreJunk())
2745 return;
2746
2747 var msgHdr = messenger.msgHdrFromURI(msgURI);
2748 var mimeHdr;
2749
2750 try {
2751 mimeHdr = aUrl.mimeHeaders;
2752 } catch (ex) {
2753 return;
2754 }
2755
2756 // If we didn't get the message id when we downloaded the message header,
2757 // we cons up an md5: message id. If we've done that, we'll try to extract
2758 // the message id out of the mime headers for the whole message.
2759 var msgId = msgHdr.messageId;
2760 if (msgId.split(":")[0] == "md5")
2761 {
2762 var mimeMsgId = mimeHdr.extractHeader("Message-Id", false);
2763 if (mimeMsgId)
2764 msgHdr.messageId = mimeMsgId;
2765 }
2766
2767 // After a msg is downloaded it's already marked READ at this point so we must check if
2768 // the msg has a "Disposition-Notification-To" header and no MDN report has been sent yet.
2769 const MSG_FLAG_MDN_REPORT_SENT = 0x800000;
2770 var msgFlags = msgHdr.flags;
2771 if ((msgFlags & MSG_FLAG_IMAP_DELETED) || (msgFlags & MSG_FLAG_MDN_REPORT_SENT))
2772 return;
2773
2774 var DNTHeader = mimeHdr.extractHeader("Disposition-Notification-To", false);
2775 var oldDNTHeader = mimeHdr.extractHeader("Return-Receipt-To", false);
2776 if (!DNTHeader && !oldDNTHeader)
2777 return;
2778
2779 // Everything looks good so far, let's generate the MDN response.
2780 var mdnGenerator = Components.classes["@mozilla.org/messenger-mdn/generator;1"].
2781 createInstance(Components.interfaces.nsIMsgMdnGenerator);
2782 const MDN_DISPOSE_TYPE_DISPLAYED = 0;
2783 mdnGenerator.process(MDN_DISPOSE_TYPE_DISPLAYED, msgWindow, msgFolder, msgHdr.messageKey, mimeHdr, false);
2784
2785 // Reset mark msg MDN "Sent" and "Not Needed".
2786 const MSG_FLAG_MDN_REPORT_NEEDED = 0x400000;
2787 msgHdr.flags = (msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED);
2788 msgHdr.OrFlags(MSG_FLAG_MDN_REPORT_SENT);
2789
2790 // Commit db changes.
2791 var msgdb = msgFolder.getMsgDatabase(msgWindow);
2792 if (msgdb)
2793 msgdb.Commit(ADDR_DB_LARGE_COMMIT);
2794 }
2795
QuickSearchFocus
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2796 function QuickSearchFocus()
2797 {
2798 var quickSearchTextBox = document.getElementById('searchInput');
2799 if (quickSearchTextBox)
2800 quickSearchTextBox.focus();
2801 }
2802
MsgSearchMessages
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2803 function MsgSearchMessages()
2804 {
2805 var preselectedFolder = null;
2806 if ("GetFirstSelectedMsgFolder" in window)
2807 preselectedFolder = GetFirstSelectedMsgFolder();
2808
2809 var args = { folder: preselectedFolder };
2810 OpenOrFocusWindow(args, "mailnews:search", "chrome://messenger/content/SearchDialog.xul");
2811 }
2812
MsgJunkMailInfo
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2813 function MsgJunkMailInfo(aCheckFirstUse)
2814 {
2815 if (aCheckFirstUse) {
2816 if (!pref.getBoolPref("mailnews.ui.junk.firstuse"))
2817 return;
2818 pref.setBoolPref("mailnews.ui.junk.firstuse", false);
2819
2820 // check to see if this is an existing profile where the user has started using
2821 // the junk mail feature already
2822 var junkmailPlugin = Components.classes["@mozilla.org/messenger/filter-plugin;1?name=bayesianfilter"]
2823 .getService(Components.interfaces.nsIJunkMailPlugin);
2824 if (junkmailPlugin.userHasClassified)
2825 return;
2826 }
2827
2828 var desiredWindow = GetWindowByWindowType("mailnews:junkmailinfo");
2829
2830 if (desiredWindow)
2831 desiredWindow.focus();
2832 else
2833 window.openDialog("chrome://messenger/content/junkMailInfo.xul", "mailnews:junkmailinfo", "centerscreen,resizeable=no,titlebar,chrome,modal", null);
2834 }
2835
MsgSearchAddresses
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2836 function MsgSearchAddresses()
2837 {
2838 var args = { directory: null };
2839 OpenOrFocusWindow(args, "mailnews:absearch", "chrome://messenger/content/ABSearchDialog.xul");
2840 }
2841
MsgFilterList
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2842 function MsgFilterList(args)
2843 {
2844 OpenOrFocusWindow(args, "mailnews:filterlist", "chrome://messenger/content/FilterListDialog.xul");
2845 }
2846
GetWindowByWindowType
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2847 function GetWindowByWindowType(windowType)
2848 {
2849 var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
2850 return windowManager.getMostRecentWindow(windowType);
2851 }
2852
OpenOrFocusWindow
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
2853 function OpenOrFocusWindow(args, windowType, chromeURL)
2854 {
2855 var desiredWindow = GetWindowByWindowType(windowType);
2856
2857 if (desiredWindow) {
2858 desiredWindow.focus();
2859 if ("refresh" in args && args.refresh)
2860 desiredWindow.refresh();
2861 }
2862 else
2863 window.openDialog(chromeURL, "", "chrome,resizable,status,centerscreen,dialog=no", args);
2864 }