1 /* JavaScript for SOGoMail */
5 if (typeof textMailAccounts != 'undefined') {
6 if (textMailAccounts.length > 0)
7 mailAccounts = textMailAccounts.evalJSON(true);
9 mailAccounts = new Array();
14 currentMailboxType: "",
16 maxCachedMessages: 20,
17 cachedMessages: new Array(),
18 foldersStateTimer: false
21 var usersRightsWindowHeight = 320;
22 var usersRightsWindowWidth = 400;
26 var deleteMessageRequestCount = 0;
28 var messageCheckTimer;
32 function openMessageWindow(msguid, url) {
35 wId += "SOGo_msg_" + msguid;
36 markMailReadInWindow(window, msguid);
38 var msgWin = openMailComposeWindow(url, wId);
44 function onMessageDoubleClick(event) {
47 if (Mailer.currentMailboxType == "draft")
52 return openMessageWindowsForSelection(action, true);
55 function toggleMailSelect(sender) {
58 row.className = sender.checked ? "tableview_selected" : "tableview";
61 function openAddressbook(sender) {
64 urlstr = ApplicationBaseURL + "../Contacts/?popup=YES";
65 var w = window.open(urlstr, "Addressbook",
66 "width=640,height=400,resizable=1,scrollbars=1,toolbar=0,"
67 + "location=no,directories=0,status=0,menubar=0,copyhistory=0");
73 function onMenuSharing(event) {
74 var folderID = document.menuTarget.getAttribute("dataname");
75 var type = document.menuTarget.getAttribute("datatype");
77 if (type == "additional")
78 window.alert(clabels["The user rights cannot be"
79 + " edited for this object!"]);
81 var urlstr = URLForFolderID(folderID) + "/acls";
82 openAclWindow(urlstr);
86 /* mail list DOM changes */
88 function markMailInWindow(win, msguid, markread) {
89 var row = win.$("row_" + msguid);
90 var subjectCell = win.$("div_" + msguid);
91 if (row && subjectCell) {
93 row.removeClassName("mailer_unreadmail");
94 subjectCell.addClassName("mailer_readmailsubject");
95 var img = win.$("unreaddiv_" + msguid);
97 img.removeClassName("mailerUnreadIcon");
98 img.addClassName("mailerReadIcon");
99 img.setAttribute("id", "readdiv_" + msguid);
100 img.setAttribute("src", ResourcesURL + "/icon_read.gif");
101 var title = img.getAttribute("title-markunread");
103 img.setAttribute("title", title);
107 row.addClassName("mailer_unreadmail");
108 subjectCell.removeClassName('mailer_readmailsubject');
109 var img = win.$("readdiv_" + msguid);
111 img.removeClassName("mailerReadIcon");
112 img.addClassName("mailerUnreadIcon");
113 img.setAttribute("id", "unreaddiv_" + msguid);
114 img.setAttribute("src", ResourcesURL + "/icon_unread.gif");
115 var title = img.getAttribute("title-markread");
117 img.setAttribute("title", title);
126 function markMailReadInWindow(win, msguid) {
127 /* this is called by UIxMailView with window.opener */
128 return markMailInWindow(win, msguid, true);
131 /* mail list reply */
133 function openMessageWindowsForSelection(action, firstOnly) {
134 if (document.body.hasClassName("popup")) {
135 var url = window.location.href;
136 var parts = url.split("/");
137 parts[parts.length-1] = action;
138 window.location.href = parts.join("/");
141 var messageList = $("messageList");
142 var rows = messageList.getSelectedRowsId();
143 if (rows.length > 0) {
144 for (var i = 0; i < rows.length; i++) {
145 openMessageWindow(rows[i].substr(4),
146 ApplicationBaseURL + Mailer.currentMailbox
147 + "/" + rows[i].substr(4)
153 window.alert(labels["Please select a message."]);
160 function mailListMarkMessage(event) {
161 var msguid = this.id.split('_')[1];
164 if ($(this).hasClassName('mailerUnreadIcon')) {
165 action = 'markMessageRead';
169 action = 'markMessageUnread';
172 var url = ApplicationBaseURL + Mailer.currentMailbox + "/" + msguid + "/" + action;
174 var data = { "window": window, "msguid": msguid, "markread": markread };
175 triggerAjaxRequest(url, mailListMarkMessageCallback, data);
177 preventDefault(event);
181 function mailListMarkMessageCallback(http) {
182 if (http.readyState == 4)
183 if (isHttpStatus204(http.status)) {
184 var data = http.callbackData;
185 markMailInWindow(data["window"], data["msguid"], data["markread"]);
188 alert("Message Mark Failed (" + http.status + "): " + http.statusText);
189 window.location.reload();
193 /* maillist row highlight */
195 var oldMaillistHighlight = null; // to remember deleted/selected style
197 function ml_highlight(sender) {
198 oldMaillistHighlight = sender.className;
199 if (oldMaillistHighlight == "tableview_highlight")
200 oldMaillistHighlight = null;
201 sender.className = "tableview_highlight";
204 function ml_lowlight(sender) {
205 if (oldMaillistHighlight) {
206 sender.className = oldMaillistHighlight;
207 oldMaillistHighlight = null;
210 sender.className = "tableview";
214 /* bulk delete of messages */
216 function deleteSelectedMessages(sender) {
217 var messageList = $("messageList");
218 var rowIds = messageList.getSelectedRowsId();
220 if (rowIds.length > 0) {
221 for (var i = 0; i < rowIds.length; i++) {
223 var rowId = rowIds[i].substr(4);
224 var messageId = Mailer.currentMailbox + "/" + rowId;
225 url = ApplicationBaseURL + messageId + "/trash";
226 deleteMessageRequestCount++;
227 var data = { "id": rowId, "mailbox": Mailer.currentMailbox, "messageId": messageId };
228 triggerAjaxRequest(url, deleteSelectedMessagesCallback, data);
232 window.alert(labels["Please select a message."]);
237 function deleteSelectedMessagesCallback(http) {
238 if (http.readyState == 4) {
239 if (isHttpStatus204(http.status)) {
240 var data = http.callbackData;
241 deleteCachedMessage(data["messageId"]);
242 deleteMessageRequestCount--;
243 if (Mailer.currentMailbox == data["mailbox"]) {
244 var div = $('messageContent');
245 if (Mailer.currentMessages[Mailer.currentMailbox] == data["id"]) {
247 Mailer.currentMessages[Mailer.currentMailbox] = null;
250 var row = $("row_" + data["id"]);
251 var nextRow = row.next("tr");
253 nextRow = row.previous("tr");
254 row.parentNode.removeChild(row);
255 // row.addClassName("deleted"); // when we'll offer "mark as deleted"
257 if (deleteMessageRequestCount == 0) {
259 Mailer.currentMessages[Mailer.currentMailbox] = nextRow.getAttribute("id").substr(4);
261 loadMessage(Mailer.currentMessages[Mailer.currentMailbox]);
268 log ("deleteSelectedMessagesCallback: problem during ajax request " + http.status);
271 function deleteDraft(url) {
272 /* this is called by UIxMailEditor with window.opener */
273 new Ajax.Request(url, {
275 onFailure: function(transport) {
276 log("draftDeleteCallback: problem during ajax request: " + transport.status);
281 function moveMessages(rowIds, folder) {
284 for (var i = 0; i < rowIds.length; i++) {
287 /* send AJAX request (synchronously) */
289 var messageId = Mailer.currentMailbox + "/" + rowIds[i];
290 url = (ApplicationBaseURL + messageId
291 + "/move?tofolder=" + folder);
292 http = createHTTPClient();
293 http.open("GET", url, false /* not async */);
295 if (http.status == 200) {
296 var row = $("row_" + rowIds[i]);
297 row.parentNode.removeChild(row);
298 deleteCachedMessage(messageId);
299 if (Mailer.currentMessages[Mailer.currentMailbox] == rowIds[i]) {
300 var div = $('messageContent');
302 Mailer.currentMessages[Mailer.currentMailbox] = null;
305 else /* request failed */
308 /* remove from page */
310 /* line-through would be nicer, but hiding is OK too */
314 alert("Could not move " + failCount + " messages!");
319 function onMenuDeleteMessage(event) {
320 deleteSelectedMessages();
321 preventDefault(event);
324 function deleteMessage(url, id, mailbox, messageId) {
325 var data = { "id": id, "mailbox": mailbox, "messageId": messageId };
326 deleteMessageRequestCount++;
327 triggerAjaxRequest(url, deleteSelectedMessagesCallback, data);
330 function deleteMessageWithDelay(url, id, mailbox, messageId) {
331 /* this is called by UIxMailPopupView with window.opener */
332 setTimeout("deleteMessage('" +
340 function onPrintCurrentMessage(event) {
341 var rowIds = $("messageList").getSelectedRowsId();
342 if (rowIds.length == 0) {
343 window.alert(labels["Please select a message to print."]);
345 else if (rowIds.length > 1) {
346 window.alert(labels["Please select only one message to print."]);
351 preventDefault(event);
354 function onMailboxTreeItemClick(event) {
355 var topNode = $("mailboxTree");
356 var mailbox = this.parentNode.getAttribute("dataname");
358 if (topNode.selectedEntry)
359 topNode.selectedEntry.deselect();
361 topNode.selectedEntry = this;
365 $("searchValue").value = "";
368 Mailer.currentMailboxType = this.parentNode.getAttribute("datatype");
369 if (Mailer.currentMailboxType == "account" || Mailer.currentMailboxType == "additional") {
370 Mailer.currentMailbox = mailbox;
371 $("messageContent").update();
372 var table = $("messageList");
373 var head = table.tHead;
374 var body = table.tBodies[0];
375 for (var i = body.rows.length; i > 0; i--)
378 head.rows[1].firstChild.update();
381 openMailbox(mailbox);
386 function _onMailboxMenuAction(menuEntry, error, actionName) {
387 var targetMailbox = menuEntry.mailbox.fullName();
388 var messages = new Array();
390 if (targetMailbox == Mailer.currentMailbox)
391 window.alert(labels[error]);
393 if (document.menuTarget.tagName == "DIV")
394 // Menu called from message content view
395 messages.push(Mailer.currentMessages[Mailer.currentMailbox]);
396 else if (Object.isArray(document.menuTarget))
397 // Menu called from multiple selection in messages list view
398 messages = $(document.menuTarget).collect(function(row) {
399 return row.getAttribute("id").substr(4);
402 // Menu called from one selection in messages list view
403 messages.push(document.menuTarget.getAttribute("id").substr(4));
405 var url_prefix = URLForFolderID(Mailer.currentMailbox) + "/";
406 messages.each(function(msgid, i) {
407 var url = url_prefix + msgid + "/" + actionName
408 + "?folder=" + targetMailbox;
409 triggerAjaxRequest(url, folderRefreshCallback,
410 ((i == messages.size() - 1)?Mailer.currentMailbox:""));
415 function onMailboxMenuMove(event) {
416 _onMailboxMenuAction(this,
417 "Moving a message into its own folder is impossible!",
421 function onMailboxMenuCopy(event) {
422 _onMailboxMenuAction(this,
423 "Copying a message into its own folder is impossible!",
427 function refreshMailbox() {
428 var topWindow = getTopWindow();
430 topWindow.refreshCurrentFolder();
435 function onComposeMessage() {
436 var topWindow = getTopWindow();
438 topWindow.composeNewMessage();
443 function composeNewMessage() {
444 var account = Mailer.currentMailbox.split("/")[1];
445 var url = ApplicationBaseURL + "/" + account + "/compose";
446 openMailComposeWindow(url);
449 function openMailbox(mailbox, reload, idx) {
450 if (mailbox != Mailer.currentMailbox || reload) {
451 Mailer.currentMailbox = mailbox;
452 var url = ApplicationBaseURL + encodeURI(mailbox) + "/view?noframe=1";
454 if (!reload || idx) {
455 var messageContent = $("messageContent");
456 messageContent.update();
457 lastClickedRow = -1; // from generic.js
463 currentMessage = Mailer.currentMessages[mailbox];
464 if (currentMessage) {
465 url += '&pageforuid=' + currentMessage;
467 loadMessage(currentMessage);
471 var searchValue = search["value"];
472 if (searchValue && searchValue.length > 0)
473 url += ("&search=" + search["criteria"]
474 + "&value=" + escape(searchValue));
475 var sortAttribute = sorting["attribute"];
476 if (sortAttribute && sortAttribute.length > 0)
477 url += ("&sort=" + sorting["attribute"]
478 + "&asc=" + sorting["ascending"]);
480 url += "&idx=" + idx;
482 if (document.messageListAjaxRequest) {
483 document.messageListAjaxRequest.aborted = true;
484 document.messageListAjaxRequest.abort();
487 var mailboxContent = $("mailboxContent");
488 if (mailboxContent.getStyle('visibility') == "hidden") {
489 mailboxContent.setStyle({ visibility: "visible" });
490 var rightDragHandle = $("rightDragHandle");
491 rightDragHandle.setStyle({ visibility: "visible" });
492 messageContent.setStyle({ top: (rightDragHandle.offsetTop
493 + rightDragHandle.offsetHeight
496 document.messageListAjaxRequest
497 = triggerAjaxRequest(url, messageListCallback,
500 var quotasUrl = ApplicationBaseURL + mailbox + "/quotas";
501 document.quotasAjaxRequest
502 = triggerAjaxRequest(quotasUrl, quotasCallback);
506 function openMailboxAtIndex(event) {
507 openMailbox(Mailer.currentMailbox, true, this.getAttribute("idx"));
512 function messageListCallback(http) {
513 var div = $('mailboxContent');
514 var table = $('messageList');
516 if (http.readyState == 4
517 && http.status == 200) {
518 document.messageListAjaxRequest = null;
522 var thead = table.tHead;
523 var addressHeaderCell = thead.rows[0].cells[3];
524 var tbody = table.tBodies[0];
525 var tmp = document.createElement('div');
526 $(tmp).update(http.responseText);
527 thead.rows[1].parentNode.replaceChild(tmp.firstChild.tHead.rows[1], thead.rows[1]);
528 addressHeaderCell.replaceChild(tmp.firstChild.tHead.rows[0].cells[3].lastChild,
529 addressHeaderCell.lastChild);
530 table.replaceChild(tmp.firstChild.tBodies[0], tbody);
534 div.update(http.responseText);
535 table = $('messageList');
536 configureMessageListEvents(table);
537 TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true});
539 configureMessageListBodyEvents(table);
541 var selected = http.callbackData;
543 var row = $("row_" + selected);
546 lastClickedRow = row.rowIndex - $(row).up('table').down('thead').getElementsByTagName('tr').length;
547 var rowPosition = row.rowIndex * row.getHeight();
548 if ($(row).up('div').getHeight() > rowPosition)
550 div.scrollTop = rowPosition; // scroll to selected message
553 $("messageContent").update();
558 if (sorting["attribute"] && sorting["attribute"].length > 0) {
559 var sortHeader = $(sorting["attribute"] + "Header");
562 var sortImages = $(table.tHead).getElementsByClassName("sortImage");
563 $(sortImages).each(function(item) {
567 var sortImage = createElement("img", "messageSortImage", "sortImage");
568 sortHeader.insertBefore(sortImage, sortHeader.firstChild);
569 if (sorting["ascending"])
570 sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
572 sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
577 var data = http.responseText;
578 var msg = data.replace(/^(.*\n)*.*<p>((.*\n)*.*)<\/p>(.*\n)*.*$/, "$2");
579 log("messageListCallback: problem during ajax request (readyState = " + http.readyState + ", status = " + http.status + ", response = " + msg + ")");
583 function quotasCallback(http) {
584 if (http.readyState == 4
585 && http.status == 200) {
586 var hasQuotas = false;
588 if (http.responseText.length > 0) {
589 var quotas = http.responseText.evalJSON(true);
590 for (var i in quotas) {
597 var treePath = Mailer.currentMailbox.split("/");
598 var quotasMB = new Array();
599 for (var i = 2; i < treePath.length; i++)
600 quotasMB.push(treePath[i].substr(6));
601 var mbQuotas = quotas["/" + quotasMB.join("/")];
602 var used = mbQuotas["usedSpace"];
603 var max = mbQuotas["maxQuota"];
604 var percents = (Math.round(used * 10000 / max) / 100);
605 var format = labels["quotasFormat"];
606 var text = format.formatted(used, max, percents);
607 window.status = text;
612 function onMessageContextMenu(event) {
613 var menu = $('messageListMenu');
614 var topNode = $('messageList');
615 var selectedNodes = topNode.getSelectedRows();
617 Event.observe(menu, "hideMenu", onMessageContextMenuHide);
619 if (selectedNodes.length > 1)
620 popupMenu(event, "messagesListMenu", selectedNodes);
622 popupMenu(event, "messageListMenu", this);
625 function onMessageContextMenuHide(event) {
626 var topNode = $('messageList');
628 if (topNode.menuSelectedEntry) {
629 topNode.menuSelectedEntry.deselect();
630 topNode.menuSelectedEntry = null;
632 if (topNode.menuSelectedRows) {
633 var nodes = topNode.menuSelectedRows;
634 for (var i = 0; i < nodes.length; i++)
636 topNode.menuSelectedRows = null;
640 function onFolderMenuClick(event) {
641 var onhide, menuName;
643 var menutype = this.parentNode.getAttribute("datatype");
645 if (menutype == "inbox") {
646 menuName = "inboxIconMenu";
647 } else if (menutype == "account") {
648 menuName = "accountIconMenu";
649 } else if (menutype == "trash") {
650 menuName = "trashIconMenu";
652 menuName = "mailboxIconMenu";
655 menuName = "mailboxIconMenu";
658 var menu = $(menuName);
659 Event.observe(menu, "hideMenu", onFolderMenuHide);
660 popupMenu(event, menuName, this.parentNode);
662 var topNode = $("mailboxTree");
663 if (topNode.selectedEntry)
664 topNode.selectedEntry.deselect();
665 if (topNode.menuSelectedEntry)
666 topNode.menuSelectedEntry.deselect();
667 topNode.menuSelectedEntry = this;
670 preventDefault(event);
673 function onFolderMenuHide(event) {
674 var topNode = $("mailboxTree");
676 if (topNode.menuSelectedEntry) {
677 topNode.menuSelectedEntry.deselect();
678 topNode.menuSelectedEntry = null;
680 if (topNode.selectedEntry)
681 topNode.selectedEntry.select();
684 function deleteCachedMessage(messageId) {
688 while (counter < Mailer.cachedMessages.length
690 if (Mailer.cachedMessages[counter]
691 && Mailer.cachedMessages[counter]['idx'] == messageId) {
692 Mailer.cachedMessages.splice(counter, 1);
699 function getCachedMessage(idx) {
703 while (counter < Mailer.cachedMessages.length
705 if (Mailer.cachedMessages[counter]
706 && Mailer.cachedMessages[counter]['idx'] == Mailer.currentMailbox + '/' + idx)
707 message = Mailer.cachedMessages[counter];
714 function storeCachedMessage(cachedMessage) {
719 if (Mailer.cachedMessages.length < Mailer.maxCachedMessages)
720 oldest = Mailer.cachedMessages.length;
722 while (Mailer.cachedMessages[counter]) {
724 || Mailer.cachedMessages[counter]['time'] < timeOldest) {
726 timeOldest = Mailer.cachedMessages[counter]['time'];
735 Mailer.cachedMessages[oldest] = cachedMessage;
738 function onMessageSelectionChange() {
739 var rows = this.getSelectedRowsId();
741 if (rows.length == 1) {
742 var idx = rows[0].substr(4);
743 if (Mailer.currentMessages[Mailer.currentMailbox] != idx) {
744 Mailer.currentMessages[Mailer.currentMailbox] = idx;
750 function loadMessage(idx) {
751 if (document.messageAjaxRequest) {
752 document.messageAjaxRequest.aborted = true;
753 document.messageAjaxRequest.abort();
756 var cachedMessage = getCachedMessage(idx);
758 markMailInWindow(window, idx, true);
759 if (cachedMessage == null) {
760 var url = (ApplicationBaseURL + Mailer.currentMailbox + "/"
761 + idx + "/view?noframe=1");
762 document.messageAjaxRequest
763 = triggerAjaxRequest(url, messageCallback, idx);
765 var div = $('messageContent');
766 div.update(cachedMessage['text']);
767 cachedMessage['time'] = (new Date()).getTime();
768 document.messageAjaxRequest = null;
769 configureLinksInMessage();
774 function configureLinksInMessage() {
775 var messageDiv = $('messageContent');
776 var mailContentDiv = document.getElementsByClassName('mailer_mailcontent',
778 if (!document.body.hasClassName("popup"))
779 mailContentDiv.observe("contextmenu", onMessageContentMenu);
781 var anchors = messageDiv.getElementsByTagName('a');
782 for (var i = 0; i < anchors.length; i++)
783 if (anchors[i].href.substring(0,7) == "mailto:") {
784 $(anchors[i]).observe("click", onEmailTo);
785 $(anchors[i]).observe("contextmenu", onEmailAddressClick);
788 $(anchors[i]).observe("click", onMessageAnchorClick);
790 var images = messageDiv.getElementsByTagName('img');
791 for (var i = 0; i < images.length; i++)
792 $(images[i]).observe("contextmenu", onImageClick);
794 var editDraftButton = $("editDraftButton");
796 Event.observe(editDraftButton, "click",
797 onMessageEditDraft.bindAsEventListener(editDraftButton));
799 configureiCalLinksInMessage();
802 function configureiCalLinksInMessage() {
803 var buttons = { "iCalendarAccept": "accept",
804 "iCalendarDecline": "decline",
805 "iCalendarTentative": "tentative",
806 "iCalendarUpdateUserStatus": "updateUserStatus",
807 "iCalendarAddToCalendar": "addToCalendar",
808 "iCalendarDeleteFromCalendar": "deleteFromCalendar" };
810 for (var key in buttons) {
813 button.action = buttons[key];
814 Event.observe(button, "click",
815 onICalendarButtonClick.bindAsEventListener(button));
820 function onICalendarButtonClick(event) {
821 var link = $("iCalendarAttachment").value;
823 var urlstr = link + "/" + this.action;
824 triggerAjaxRequest(urlstr, ICalendarButtonCallback,
825 Mailer.currentMailbox + "/"
826 + Mailer.currentMessages[Mailer.currentMailbox]);
832 function ICalendarButtonCallback(http) {
833 if (http.readyState == 4)
834 if (isHttpStatus204(http.status)) {
835 var oldMsg = http.callbackData;
836 var msg = Mailer.currentMailbox + "/" + Mailer.currentMessages[Mailer.currentMailbox];
838 deleteCachedMessage(oldMsg);
839 loadMessage(Mailer.currentMessages[Mailer.currentMailbox]);
843 window.alert("received code: " + http.status);
847 function resizeMailContent() {
848 var headerTable = document.getElementsByClassName('mailer_fieldtable')[0];
849 var contentDiv = document.getElementsByClassName('mailer_mailcontent')[0];
851 contentDiv.setStyle({ 'top':
852 (Element.getHeight(headerTable) + headerTable.offsetTop) + 'px' });
855 function onMessageContentMenu(event) {
856 var element = getTarget(event);
857 if ((element.tagName == 'A' && element.href.substring(0,7) == "mailto:")
858 || element.tagName == 'IMG')
859 // Don't show the default contextual menu; let the click propagate to
862 popupMenu(event, 'messageContentMenu', this);
865 function onMessageEditDraft(event) {
866 return openMessageWindowsForSelection("edit", true);
869 function onEmailAddressClick(event) {
870 popupMenu(event, 'addressMenu', this);
871 preventDefault(event);
875 function onMessageAnchorClick(event) {
876 window.open(this.href);
877 preventDefault(event);
880 function onImageClick(event) {
881 popupMenu(event, 'imageMenu', this);
882 preventDefault(event);
886 function messageCallback(http) {
887 var div = $('messageContent');
889 if (http.readyState == 4
890 && http.status == 200) {
891 document.messageAjaxRequest = null;
892 div.update(http.responseText);
893 configureLinksInMessage();
896 if (http.callbackData) {
897 var cachedMessage = new Array();
898 cachedMessage['idx'] = Mailer.currentMailbox + '/' + http.callbackData;
899 cachedMessage['time'] = (new Date()).getTime();
900 cachedMessage['text'] = http.responseText;
901 if (cachedMessage['text'].length < 30000)
902 storeCachedMessage(cachedMessage);
906 log("messageCallback: problem during ajax request: " + http.status);
909 function processMailboxMenuAction(mailbox) {
910 var currentNode, upperNode;
914 mailboxName = mailbox.getAttribute('mailboxname');
915 currentNode = mailbox;
919 && !currentNode.hasAttribute('mailboxaction'))
920 currentNode = currentNode.parentNode.parentNode.parentMenuItem;
924 action = currentNode.getAttribute('mailboxaction');
925 // var rows = collectSelectedRows();
926 // var rString = rows.join(', ');
927 // alert("performing '" + action + "' on " + rString
928 // + " to " + mailboxName);
932 var rowSelectionCount = 0;
936 function showElement(e, shouldShow) {
937 e.style.display = shouldShow ? "" : "none";
940 function enableElement(e, shouldEnable) {
944 if(e.hasAttribute("disabled"))
945 e.removeAttribute("disabled");
948 e.setAttribute("disabled", "1");
952 function validateControls() {
954 this.enableElement(e, rowSelectionCount > 0);
957 function moveTo(uri) {
958 alert("MoveTo: " + uri);
961 /* message menu entries */
962 function onMenuOpenMessage(event) {
963 return openMessageWindowsForSelection('popupview');
966 function onMenuReplyToSender(event) {
967 return openMessageWindowsForSelection('reply');
970 function onMenuReplyToAll(event) {
971 return openMessageWindowsForSelection('replyall');
974 function onMenuForwardMessage(event) {
975 return openMessageWindowsForSelection('forward');
978 function onMenuViewMessageSource(event) {
979 var messageList = $("messageList");
980 var rows = messageList.getSelectedRowsId();
982 if (rows.length > 0) {
983 var url = (ApplicationBaseURL + Mailer.currentMailbox + "/"
984 + rows[0].substr(4) + "/viewsource");
985 openMailComposeWindow(url);
988 preventDefault(event);
991 function saveImage(event) {
992 var img = document.menuTarget;
993 var url = img.getAttribute("src");
994 var urlAsAttachment = url.replace(/(\/[^\/]*)$/,"/asAttachment$1");
996 window.location.href = urlAsAttachment;
1000 function newContactFromEmail(event) {
1001 var mailto = document.menuTarget.innerHTML;
1003 var email = extractEmailAddress(mailto);
1004 var c_name = extractEmailName(mailto);
1005 if (email.length > 0)
1007 var url = UserFolderURL + "Contacts/new?contactEmail=" + email;
1009 url += "&contactFN=" + c_name;
1010 openContactWindow(url);
1013 return false; /* stop following the link */
1016 function onEmailTo(event) {
1017 openMailTo(this.innerHTML.strip());
1018 preventDefault(event);
1022 function newEmailTo(sender) {
1023 return openMailTo(document.menuTarget.innerHTML);
1026 function expandUpperTree(node) {
1027 var currentNode = node.parentNode;
1029 while (currentNode.className != "dtree") {
1030 if (currentNode.className == 'clip') {
1031 var id = currentNode.getAttribute("id");
1032 var number = parseInt(id.substr(2));
1034 var cn = mailboxTree.aNodes[number];
1035 mailboxTree.nodeStatus(1, number, cn._ls);
1038 currentNode = currentNode.parentNode;
1042 function onHeaderClick(event) {
1043 var headerId = this.getAttribute("id");
1044 var newSortAttribute;
1045 if (headerId == "subjectHeader")
1046 newSortAttribute = "subject";
1047 else if (headerId == "fromHeader")
1048 newSortAttribute = "from";
1049 else if (headerId == "dateHeader")
1050 newSortAttribute = "date";
1052 newSortAttribute = "arrival";
1054 if (sorting["attribute"] == newSortAttribute)
1055 sorting["ascending"] = !sorting["ascending"];
1057 sorting["attribute"] = newSortAttribute;
1058 sorting["ascending"] = true;
1060 refreshCurrentFolder();
1065 function refreshCurrentFolder() {
1066 openMailbox(Mailer.currentMailbox, true);
1069 function refreshFolderByType(type) {
1070 if (Mailer.currentMailboxType == type)
1071 refreshCurrentFolder();
1074 var mailboxSpanAcceptType = function(type) {
1075 return (type == "mailRow");
1078 var mailboxSpanEnter = function() {
1079 this.addClassName("_dragOver");
1082 var mailboxSpanExit = function() {
1083 this.removeClassName("_dragOver");
1086 var mailboxSpanDrop = function(data) {
1087 var success = false;
1090 var folder = this.parentNode.parentNode.getAttribute("dataname");
1091 if (folder != Mailer.currentMailbox)
1092 success = (moveMessages(data, folder) == 0);
1100 var plusSignEnter = function() {
1101 var nodeNr = parseInt(this.id.substr(2));
1102 if (!mailboxTree.aNodes[nodeNr]._io)
1103 this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000);
1106 var plusSignExit = function() {
1107 if (this.plusSignTimer) {
1108 clearTimeout(this.plusSignTimer);
1109 this.plusSignTimer = null;
1113 function openPlusSign(nodeNr) {
1114 mailboxTree.nodeStatus(1, nodeNr, mailboxTree.aNodes[nodeNr]._ls);
1115 mailboxTree.aNodes[nodeNr]._io = 1;
1116 this.plusSignTimer = null;
1119 var messageListGhost = function () {
1120 var newDiv = document.createElement("div");
1121 // newDiv.style.width = "25px;";
1122 // newDiv.style.height = "25px;";
1123 newDiv.style.backgroundColor = "#aae;";
1124 newDiv.style.border = "2px solid #a3a;";
1125 newDiv.style.padding = "5px;";
1126 newDiv.ghostOffsetX = 10;
1127 newDiv.ghostOffsetY = 5;
1129 var newImg = document.createElement("img");
1130 newImg.src = ResourcesURL + "/message-mail.png";
1132 var list = $("messageList");
1133 var count = list.getSelectedRows().length;
1134 newDiv.appendChild(newImg);
1135 newDiv.appendChild(document.createElement("br"));
1136 newDiv.appendChild(document.createTextNode(count + " messages..."));
1141 var messageListData = function(type) {
1142 var rows = this.parentNode.parentNode.getSelectedRowsId();
1143 var msgIds = new Array();
1144 for (var i = 0; i < rows.length; i++)
1145 msgIds.push(rows[i].substr(4));
1150 /* a model for a futur refactoring of the sortable table headers mechanism */
1151 function configureMessageListEvents(table) {
1153 table.multiselect = true;
1154 // Each body row can load a message
1155 Event.observe(table, "mousedown",
1156 onMessageSelectionChange.bindAsEventListener(table));
1158 configureSortableTableHeaders(table);
1162 function configureMessageListBodyEvents(table) {
1165 var cell = table.tHead.rows[1].cells[0];
1166 if ($(cell).hasClassName("tbtv_navcell")) {
1167 var anchors = $(cell).childNodesWithTag("a");
1168 for (var i = 0; i < anchors.length; i++)
1169 Event.observe(anchors[i], "click", openMailboxAtIndex.bindAsEventListener(anchors[i]));
1172 rows = table.tBodies[0].rows;
1173 for (var i = 0; i < rows.length; i++) {
1174 Event.observe(rows[i], "mousedown", onRowClick);
1175 Event.observe(rows[i], "selectstart", listRowMouseDownHandler);
1176 Event.observe(rows[i], "contextmenu", onMessageContextMenu.bindAsEventListener(rows[i]));
1178 rows[i].dndTypes = function() { return new Array("mailRow"); };
1179 rows[i].dndGhost = messageListGhost;
1180 rows[i].dndDataForType = messageListData;
1181 // document.DNDManager.registerSource(rows[i]);
1183 for (var j = 0; j < rows[i].cells.length; j++) {
1184 var cell = rows[i].cells[j];
1185 Event.observe(cell, "mousedown", listRowMouseDownHandler);
1186 if (j == 2 || j == 3 || j == 5)
1187 Event.observe(cell, "dblclick", onMessageDoubleClick.bindAsEventListener(cell));
1189 var img = cell.childNodesWithTag("img")[0];
1190 Event.observe(img, "click", mailListMarkMessage.bindAsEventListener(img));
1197 function configureDragHandles() {
1198 var handle = $("verticalDragHandle");
1200 handle.addInterface(SOGoDragHandlesInterface);
1201 handle.leftMargin = 1;
1202 handle.leftBlock=$("leftPanel");
1203 handle.rightBlock=$("rightPanel");
1206 handle = $("rightDragHandle");
1208 handle.addInterface(SOGoDragHandlesInterface);
1209 handle.upperBlock=$("mailboxContent");
1210 handle.lowerBlock=$("messageContent");
1215 function initDnd() {
1216 // log("MailerUI initDnd");
1218 var tree = $("mailboxTree");
1220 var images = tree.getElementsByTagName("img");
1221 for (var i = 0; i < images.length; i++) {
1222 if (images[i].id[0] == 'j') {
1223 images[i].dndAcceptType = mailboxSpanAcceptType;
1224 images[i].dndEnter = plusSignEnter;
1225 images[i].dndExit = plusSignExit;
1226 document.DNDManager.registerDestination(images[i]);
1229 var nodes = document.getElementsByClassName("nodeName", tree);
1230 for (var i = 0; i < nodes.length; i++) {
1231 nodes[i].dndAcceptType = mailboxSpanAcceptType;
1232 nodes[i].dndEnter = mailboxSpanEnter;
1233 nodes[i].dndExit = mailboxSpanExit;
1234 nodes[i].dndDrop = mailboxSpanDrop;
1235 document.DNDManager.registerDestination(nodes[i]);
1242 function refreshContacts() {
1245 function openInbox(node) {
1247 openMailbox(node.parentNode.getAttribute("dataname"));
1248 var tree = $("mailboxTree");
1249 tree.selectedEntry = node;
1254 function initMailer(event) {
1255 if (!$(document.body).hasClassName("popup")) {
1258 initMessageCheckTimer();
1261 // Default sort options
1262 sorting["attribute"] = "date";
1263 sorting["ascending"] = false;
1266 function initMessageCheckTimer() {
1267 var messageCheck = userDefaults["MessageCheck"];
1268 if (messageCheck && messageCheck != "manually") {
1270 if (messageCheck == "once_per_hour")
1272 else if (messageCheck == "every_minute")
1275 interval = parseInt(messageCheck.substr(6)) * 60;
1277 messageCheckTimer = window.setInterval(onMessageCheckCallback,
1282 function onMessageCheckCallback(event) {
1286 function initMailboxTree() {
1287 mailboxTree = new dTree("mailboxTree");
1288 mailboxTree.config.folderLinks = true;
1289 mailboxTree.config.hideRoot = true;
1291 mailboxTree.icon.root = ResourcesURL + "/tbtv_account_17x17.gif";
1292 mailboxTree.icon.folder = ResourcesURL + "/tbtv_leaf_corner_17x17.gif";
1293 mailboxTree.icon.folderOpen = ResourcesURL + "/tbtv_leaf_corner_17x17.gif";
1294 mailboxTree.icon.node = ResourcesURL + "/tbtv_leaf_corner_17x17.gif";
1295 mailboxTree.icon.line = ResourcesURL + "/tbtv_line_17x17.gif";
1296 mailboxTree.icon.join = ResourcesURL + "/tbtv_junction_17x17.gif";
1297 mailboxTree.icon.joinBottom = ResourcesURL + "/tbtv_corner_17x17.gif";
1298 mailboxTree.icon.plus = ResourcesURL + "/tbtv_plus_17x17.gif";
1299 mailboxTree.icon.plusBottom = ResourcesURL + "/tbtv_corner_plus_17x17.gif";
1300 mailboxTree.icon.minus = ResourcesURL + "/tbtv_minus_17x17.gif";
1301 mailboxTree.icon.minusBottom = ResourcesURL + "/tbtv_corner_minus_17x17.gif";
1302 mailboxTree.icon.nlPlus = ResourcesURL + "/tbtv_corner_plus_17x17.gif";
1303 mailboxTree.icon.nlMinus = ResourcesURL + "/tbtv_corner_minus_17x17.gif";
1304 mailboxTree.icon.empty = ResourcesURL + "/empty.gif";
1306 mailboxTree.add(0, -1, '');
1308 mailboxTree.pendingRequests = mailAccounts.length;
1309 activeAjaxRequests += mailAccounts.length;
1310 for (var i = 0; i < mailAccounts.length; i++) {
1311 var url = ApplicationBaseURL + mailAccounts[i] + "/mailboxes";
1312 triggerAjaxRequest(url, onLoadMailboxesCallback, mailAccounts[i]);
1316 function updateMailboxTreeInPage() {
1317 $("folderTreeContent").update(mailboxTree);
1319 var inboxFound = false;
1320 var tree = $("mailboxTree");
1321 var nodes = document.getElementsByClassName("node", tree);
1322 for (i = 0; i < nodes.length; i++) {
1323 Event.observe(nodes[i], "click",
1324 onMailboxTreeItemClick.bindAsEventListener(nodes[i]));
1325 Event.observe(nodes[i], "contextmenu",
1326 onFolderMenuClick.bindAsEventListener(nodes[i]));
1328 && nodes[i].parentNode.getAttribute("datatype") == "inbox") {
1329 Mailer.currentMailboxType = "inbox";
1330 openInbox(nodes[i]);
1336 function mailboxMenuNode(type, name) {
1337 var newNode = document.createElement("li");
1338 var icon = MailerUIdTreeExtension.folderIcons[type];
1340 icon = "tbtv_leaf_corner_17x17.gif";
1341 var image = document.createElement("img");
1342 image.src = ResourcesURL + "/" + icon;
1343 newNode.appendChild(image);
1344 var displayName = MailerUIdTreeExtension.folderNames[type];
1347 newNode.appendChild(document.createTextNode(" " + displayName));
1352 function generateMenuForMailbox(mailbox, prefix, callback) {
1353 var menuDIV = document.createElement("div");
1354 $(menuDIV).addClassName("menu");
1355 menuDIV.setAttribute("id", prefix + "Submenu");
1356 var menu = document.createElement("ul");
1357 menuDIV.appendChild(menu);
1358 pageContent.appendChild(menuDIV);
1360 var callbacks = new Array();
1361 if (mailbox.type != "account") {
1362 var newNode = document.createElement("li");
1363 newNode.mailbox = mailbox;
1364 newNode.appendChild(document.createTextNode(labels["This Folder"]));
1365 menu.appendChild(newNode);
1366 menu.appendChild(document.createElement("li"));
1367 callbacks.push(callback);
1368 callbacks.push("-");
1371 var submenuCount = 0;
1372 for (var i = 0; i < mailbox.children.length; i++) {
1373 var child = mailbox.children[i];
1374 var newNode = mailboxMenuNode(child.type, child.name);
1375 menu.appendChild(newNode);
1376 if (child.children.length > 0) {
1377 var newPrefix = prefix + submenuCount;
1378 var newSubmenuId = generateMenuForMailbox(child, newPrefix, callback);
1379 callbacks.push(newSubmenuId);
1383 newNode.mailbox = child;
1384 callbacks.push(callback);
1387 initMenu(menuDIV, callbacks);
1389 return menuDIV.getAttribute("id");
1392 function updateMailboxMenus() {
1393 var mailboxActions = { move: onMailboxMenuMove,
1394 copy: onMailboxMenuCopy };
1396 for (key in mailboxActions) {
1397 var menuId = key + "MailboxMenu";
1398 var menuDIV = $(menuId);
1400 menuDIV.parentNode.removeChild(menuDIV);
1402 menuDIV = document.createElement("div");
1403 pageContent = $("pageContent");
1404 pageContent.appendChild(menuDIV);
1406 var menu = document.createElement("ul");
1407 menuDIV.appendChild(menu);
1409 $(menuDIV).addClassName("menu");
1410 menuDIV.setAttribute("id", menuId);
1412 var submenuIds = new Array();
1413 for (var i = 0; i < mailAccounts.length; i++) {
1414 var menuEntry = mailboxMenuNode("account", mailAccounts[i]);
1415 menu.appendChild(menuEntry);
1416 var mailbox = accounts[mailAccounts[i]];
1417 var newSubmenuId = generateMenuForMailbox(mailbox,
1418 key, mailboxActions[key]);
1419 submenuIds.push(newSubmenuId);
1421 initMenu(menuDIV, submenuIds);
1425 function onLoadMailboxesCallback(http) {
1426 if (http.readyState == 4
1427 && http.status == 200) {
1428 checkAjaxRequestsState();
1429 if (http.responseText.length > 0) {
1430 var newAccount = buildMailboxes(http.callbackData,
1432 accounts[http.callbackData] = newAccount;
1433 mailboxTree.addMailAccount(newAccount);
1434 mailboxTree.pendingRequests--;
1435 activeAjaxRequests--;
1436 if (!mailboxTree.pendingRequests) {
1437 updateMailboxTreeInPage();
1438 updateMailboxMenus();
1439 checkAjaxRequestsState();
1445 // var tree = $("mailboxTree");
1446 // var treeNodes = document.getElementsByClassName("dTreeNode", tree);
1448 // while (i < treeNodes.length
1449 // && treeNodes[i].getAttribute("dataname") != Mailer.currentMailbox)
1451 // if (i < treeNodes.length) {
1452 // // log("found mailbox");
1453 // var links = document.getElementsByClassName("node", treeNodes[i]);
1454 // if (tree.selectedEntry)
1455 // tree.selectedEntry.deselect();
1456 // links[0].select();
1457 // tree.selectedEntry = links[0];
1458 // expandUpperTree(links[0]);
1462 function buildMailboxes(accountName, encoded) {
1463 var account = new Mailbox("account", accountName);
1464 var data = encoded.evalJSON(true);
1465 for (var i = 0; i < data.length; i++) {
1466 var currentNode = account;
1467 var names = data[i].path.split("/");
1468 for (var j = 1; j < (names.length - 1); j++) {
1469 var node = currentNode.findMailboxByName(names[j]);
1471 node = new Mailbox("additional", names[j]);
1472 currentNode.addMailbox(node);
1476 var basename = names[names.length-1];
1477 var leaf = currentNode.findMailboxByName(basename);
1479 leaf.type = data[i].type;
1481 leaf = new Mailbox(data[i].type, basename);
1482 currentNode.addMailbox(leaf);
1489 function getFoldersState() {
1490 if (mailAccounts.length > 0) {
1491 var urlstr = ApplicationBaseURL + "foldersState";
1492 triggerAjaxRequest(urlstr, getFoldersStateCallback);
1496 function getFoldersStateCallback(http) {
1497 if (http.readyState == 4
1498 && http.status == 200) {
1499 if (http.responseText.length > 0) {
1500 // The response text is a JSOn representation
1501 // of the folders that were left opened.
1502 var data = http.responseText.evalJSON(true);
1503 for (var i = 1; i < mailboxTree.aNodes.length; i++) {
1504 if ($(data).indexOf(mailboxTree.aNodes[i].dataname) > 0)
1505 // If the folder is found, open it
1510 mailboxTree.autoSync();
1513 function saveFoldersState() {
1514 if (mailAccounts.length > 0) {
1515 var foldersState = mailboxTree.getFoldersState();
1516 var urlstr = ApplicationBaseURL + "saveFoldersState" + "?expandedFolders=" + foldersState;
1517 triggerAjaxRequest(urlstr, saveFoldersStateCallback);
1521 function saveFoldersStateCallback(http) {
1522 if (http.readyState == 4
1523 && isHttpStatus204(http.status)) {
1524 log ("folders state saved");
1528 function onMenuCreateFolder(event) {
1529 var name = window.prompt(labels["Name :"], "");
1530 if (name && name.length > 0) {
1531 var folderID = document.menuTarget.getAttribute("dataname");
1532 var urlstr = URLForFolderID(folderID) + "/createFolder?name=" + name;
1533 triggerAjaxRequest(urlstr, folderOperationCallback);
1537 function onMenuRenameFolder(event) {
1538 var name = window.prompt(labels["Enter the new name of your folder :"]
1541 if (name && name.length > 0) {
1542 var folderID = document.menuTarget.getAttribute("dataname");
1543 var urlstr = URLForFolderID(folderID) + "/renameFolder?name=" + name;
1544 triggerAjaxRequest(urlstr, folderOperationCallback);
1548 function onMenuDeleteFolder(event) {
1549 var answer = window.confirm(labels["Do you really want to move this folder into the trash ?"]);
1551 var folderID = document.menuTarget.getAttribute("dataname");
1552 var urlstr = URLForFolderID(folderID) + "/deleteFolder";
1553 triggerAjaxRequest(urlstr, folderOperationCallback);
1557 function onMenuExpungeFolder(event) {
1558 var folderID = document.menuTarget.getAttribute("dataname");
1559 var urlstr = URLForFolderID(folderID) + "/expunge";
1560 triggerAjaxRequest(urlstr, folderRefreshCallback, folderID);
1563 function onMenuEmptyTrash(event) {
1564 var folderID = document.menuTarget.getAttribute("dataname");
1565 var urlstr = URLForFolderID(folderID) + "/emptyTrash";
1566 triggerAjaxRequest(urlstr, folderOperationCallback, folderID);
1568 if (folderID == Mailer.currentMailbox) {
1569 var div = $('messageContent');
1570 for (var i = div.childNodes.length - 1; i > -1; i--)
1571 div.removeChild(div.childNodes[i]);
1572 refreshCurrentFolder();
1574 var msgID = Mailer.currentMessages[folderID];
1576 deleteCachedMessage(folderID + "/" + msgID);
1579 function _onMenuChangeToXXXFolder(event, folder) {
1580 var type = document.menuTarget.getAttribute("datatype");
1581 if (type == "additional")
1582 window.alert(labels["You need to choose a non-virtual folder!"]);
1584 var folderID = document.menuTarget.getAttribute("dataname");
1585 var urlstr = URLForFolderID(folderID) + "/setAs" + folder + "Folder";
1586 triggerAjaxRequest(urlstr, folderOperationCallback);
1590 function onMenuChangeToDraftsFolder(event) {
1591 return _onMenuChangeToXXXFolder(event, "Drafts");
1594 function onMenuChangeToSentFolder(event) {
1595 return _onMenuChangeToXXXFolder(event, "Sent");
1598 function onMenuChangeToTrashFolder(event) {
1599 return _onMenuChangeToXXXFolder(event, "Trash");
1602 function onMenuLabelNone() {
1603 var messages = new Array();
1605 if (document.menuTarget.tagName == "DIV")
1606 // Menu called from message content view
1607 messages.push(Mailer.currentMessages[Mailer.currentMailbox]);
1608 else if (Object.isArray(document.menuTarget))
1609 // Menu called from multiple selection in messages list view
1610 $(document.menuTarget).collect(function(row) {
1611 messages.push(row.getAttribute("id").substr(4));
1614 // Menu called from one selection in messages list view
1615 messages.push(document.menuTarget.getAttribute("id").substr(4));
1617 var url = ApplicationBaseURL + Mailer.currentMailbox + "/";
1618 messages.each(function(id) {
1619 triggerAjaxRequest(url + id + "/removeAllLabels",
1620 messageFlagCallback,
1621 { mailbox: Mailer.currentMailbox, msg: id, label: null } );
1625 function _onMenuLabelFlagX(flag) {
1626 var messages = new Hash();
1628 if (document.menuTarget.tagName == "DIV")
1629 // Menu called from message content view
1630 messages.set(Mailer.currentMessages[Mailer.currentMailbox],
1631 $('tr#row_' + Mailer.currentMessages[Mailer.currentMailbox]).getAttribute("labels"));
1632 else if (Object.isArray(document.menuTarget))
1633 // Menu called from multiple selection in messages list view
1634 $(document.menuTarget).collect(function(row) {
1635 messages.set(row.getAttribute("id").substr(4),
1636 row.getAttribute("labels"));
1639 // Menu called from one selection in messages list view
1640 messages.set(document.menuTarget.getAttribute("id").substr(4),
1641 document.menuTarget.getAttribute("labels"));
1643 var url = ApplicationBaseURL + Mailer.currentMailbox + "/";
1644 messages.keys().each(function(id) {
1645 var flags = messages.get(id).split(" ");
1646 var operation = "add";
1648 if (flags.indexOf("label" + flag) > -1)
1649 operation = "remove";
1651 triggerAjaxRequest(url + id + "/" + operation + "Label" + flag,
1652 messageFlagCallback,
1653 { mailbox: Mailer.currentMailbox, msg: id,
1654 label: operation + flag } );
1658 function onMenuLabelFlag1() {
1659 _onMenuLabelFlagX(1);
1662 function onMenuLabelFlag2() {
1663 _onMenuLabelFlagX(2);
1666 function onMenuLabelFlag3() {
1667 _onMenuLabelFlagX(3);
1670 function onMenuLabelFlag4() {
1671 _onMenuLabelFlagX(4);
1674 function onMenuLabelFlag5() {
1675 _onMenuLabelFlagX(5);
1678 function folderOperationCallback(http) {
1679 if (http.readyState == 4
1680 && isHttpStatus204(http.status))
1683 window.alert(labels["Operation failed"]);
1686 function folderRefreshCallback(http) {
1687 if (http.readyState == 4
1688 && isHttpStatus204(http.status)) {
1689 var oldMailbox = http.callbackData;
1690 if (oldMailbox == Mailer.currentMailbox)
1691 refreshCurrentFolder();
1694 window.alert(labels["Operation failed"]);
1697 function messageFlagCallback(http) {
1698 if (http.readyState == 4
1699 && isHttpStatus204(http.status)) {
1700 var data = http.callbackData;
1701 if (data["mailbox"] == Mailer.currentMailbox) {
1702 var row = $("row_" + data["msg"]);
1703 var operation = data["label"];
1705 var labels = row.getAttribute("labels");
1707 if (labels.length > 0)
1708 flags = labels.split(" ");
1710 flags = new Array();
1711 if (operation.substr(0, 3) == "add")
1712 flags.push("label" + operation.substr(3));
1714 var flag = "label" + operation.substr(6);
1715 var idx = flags.indexOf(flag);
1716 flags.splice(idx, 1);
1718 row.setAttribute("labels", flags.join(" "));
1721 row.setAttribute("labels", "");
1726 function onLabelMenuPrepareVisibility() {
1727 var messageList = $("messageList");
1731 var rows = messageList.getSelectedRows();
1732 for (var i = 0; i < rows.length; i++) {
1733 $w(rows[i].getAttribute("labels")).each(function(flag) {
1739 var lis = this.childNodesWithTag("ul")[0].childNodesWithTag("li")
1740 var isFlagged = false;
1741 for (var i = 1; i < 6; i++) {
1742 if (flags["label" + i]) {
1744 lis[1 + i].addClassName("_chosen");
1747 lis[1 + i].removeClassName("_chosen");
1750 lis[0].removeClassName("_chosen");
1752 lis[0].addClassName("_chosen");
1755 function getMenus() {
1757 menus["accountIconMenu"] = new Array(null, null, onMenuCreateFolder, null,
1759 menus["inboxIconMenu"] = new Array(null, null, null, "-", null,
1760 onMenuCreateFolder, onMenuExpungeFolder,
1763 menus["trashIconMenu"] = new Array(null, null, null, "-", null,
1764 onMenuCreateFolder, onMenuExpungeFolder,
1765 onMenuEmptyTrash, "-", null,
1767 menus["mailboxIconMenu"] = new Array(null, null, null, "-", null,
1770 onMenuExpungeFolder,
1775 menus["addressMenu"] = new Array(newContactFromEmail, newEmailTo, null);
1776 menus["messageListMenu"] = new Array(onMenuOpenMessage, "-",
1777 onMenuReplyToSender,
1779 onMenuForwardMessage, null,
1780 "-", "moveMailboxMenu",
1781 "copyMailboxMenu", "label-menu",
1782 "mark-menu", "-", null,
1783 onMenuViewMessageSource, null,
1784 null, onMenuDeleteMessage);
1785 menus["messagesListMenu"] = new Array(onMenuForwardMessage,
1786 "-", "moveMailboxMenu",
1787 "copyMailboxMenu", "label-menu",
1790 onMenuDeleteMessage);
1791 menus["imageMenu"] = new Array(saveImage);
1792 menus["messageContentMenu"] = new Array(onMenuReplyToSender,
1794 onMenuForwardMessage,
1795 null, "moveMailboxMenu",
1797 "-", "label-menu", "mark-menu",
1799 null, onMenuViewMessageSource,
1800 null, onPrintCurrentMessage,
1801 onMenuDeleteMessage);
1802 menus["folderTypeMenu"] = new Array(onMenuChangeToSentFolder,
1803 onMenuChangeToDraftsFolder,
1804 onMenuChangeToTrashFolder);
1806 menus["label-menu"] = new Array(onMenuLabelNone, "-", onMenuLabelFlag1,
1807 onMenuLabelFlag2, onMenuLabelFlag3,
1808 onMenuLabelFlag4, onMenuLabelFlag5);
1809 menus["mark-menu"] = new Array(null, null, null, null, "-", null, "-",
1811 menus["searchMenu"] = new Array(setSearchCriteria, setSearchCriteria,
1812 setSearchCriteria, setSearchCriteria,
1814 var labelMenu = $("label-menu");
1816 labelMenu.prepareVisibility = onLabelMenuPrepareVisibility;
1821 FastInit.addOnLoad(initMailer);
1823 function Mailbox(type, name) {
1826 this.parentFolder = null;
1827 this.children = new Array();
1831 Mailbox.prototype.dump = function(indent) {
1834 log(" ".repeat(indent) + this.name);
1835 for (var i = 0; i < this.children.length; i++) {
1836 this.children[i].dump(indent + 2);
1840 Mailbox.prototype.fullName = function() {
1843 var currentFolder = this;
1844 while (currentFolder.parentFolder) {
1845 fullName = "/folder" + currentFolder.name + fullName;
1846 currentFolder = currentFolder.parentFolder;
1849 return "/" + currentFolder.name + fullName;
1852 Mailbox.prototype.findMailboxByName = function(name) {
1856 while (!mailbox && i < this.children.length)
1857 if (this.children[i].name == name)
1858 mailbox = this.children[i];
1865 Mailbox.prototype.addMailbox = function(mailbox) {
1866 mailbox.parentFolder = this;
1867 this.children.push(mailbox);