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