X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=UI%2FWebServerResources%2FMailerUI.js;h=f2568018bc7b9f031b1227ae8d589d8fc7e85b90;hb=204a5e9e597063c8a01142f01d91f2138f93e5a5;hp=074a94f944c3167deca28fc5eff81d87ca9d44cf;hpb=030c456ced93c43bf394cff1e1cb89fca83890dd;p=scalable-opengroupware.org diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 074a94f9..f2568018 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -1,16 +1,32 @@ /* JavaScript for SOGoMail */ var accounts = {}; var mailboxTree; +var mailAccounts; +if (typeof textMailAccounts != 'undefined') { + if (textMailAccounts.length > 0) + mailAccounts = textMailAccounts.evalJSON(true); + else + mailAccounts = new Array(); +} -var currentMessages = new Array(); -var maxCachedMessages = 20; -var cachedMessages = new Array(); -var currentMailbox = null; -var currentMailboxType = ""; +var Mailer = { + currentMailbox: null, + currentMailboxType: "", + currentMessages: {}, + maxCachedMessages: 20, + cachedMessages: new Array(), + foldersStateTimer: false +}; var usersRightsWindowHeight = 320; var usersRightsWindowWidth = 400; +var pageContent; + +var deleteMessageRequestCount = 0; + +var messageCheckTimer; + /* mail list */ function openMessageWindow(msguid, url) { @@ -20,10 +36,6 @@ function openMessageWindow(msguid, url) { markMailReadInWindow(window, msguid); } var msgWin = openMailComposeWindow(url, wId); - if (msguid) { - msgWin.messageId = msguid; - msgWin.messageURL = ApplicationBaseURL + currentMailbox + "/" + msguid; - } msgWin.focus(); return false; @@ -32,7 +44,7 @@ function openMessageWindow(msguid, url) { function onMessageDoubleClick(event) { var action; - if (currentMailboxType == "draft") + if (Mailer.currentMailboxType == "draft") action = "edit"; else action = "popupview"; @@ -48,11 +60,11 @@ function toggleMailSelect(sender) { function openAddressbook(sender) { var urlstr; - - urlstr = ApplicationBaseURL + "/../Contacts/?popup=YES"; + + urlstr = ApplicationBaseURL + "../Contacts/?popup=YES"; var w = window.open(urlstr, "Addressbook", "width=640,height=400,resizable=1,scrollbars=1,toolbar=0," - + "location=0,directories=0,status=0,menubar=0,copyhistory=0"); + + "location=no,directories=0,status=0,menubar=0,copyhistory=0"); w.focus(); return false; @@ -60,54 +72,50 @@ function openAddressbook(sender) { function onMenuSharing(event) { var folderID = document.menuTarget.getAttribute("dataname"); - var urlstr = URLForFolderID(folderID) + "/acls"; - preventDefault(event); + var type = document.menuTarget.getAttribute("datatype"); - openAclWindow(urlstr); + if (type == "additional") + window.alert(clabels["The user rights cannot be" + + " edited for this object!"]); + else { + var urlstr = URLForFolderID(folderID) + "/acls"; + openAclWindow(urlstr); + } } /* mail list DOM changes */ function markMailInWindow(win, msguid, markread) { - var msgDiv; - - msgDiv = win.$("div_" + msguid); - if (msgDiv) { + var row = win.$("row_" + msguid); + var subjectCell = win.$("div_" + msguid); + if (row && subjectCell) { if (markread) { - msgDiv.removeClassName("mailer_unreadmailsubject"); - msgDiv.addClassName("mailer_readmailsubject"); - msgDiv = win.$("unreaddiv_" + msguid); - if (msgDiv) - { - msgDiv.setAttribute("class", "mailerUnreadIcon"); - msgDiv.setAttribute("id", "readdiv_" + msguid); - msgDiv.setAttribute("src", ResourcesURL + "/icon_read.gif"); - msgDiv.setAttribute("onclick", "mailListMarkMessage(this," - + " 'markMessageUnread', " + msguid - + ", false);" - +" return false;"); - var title = msgDiv.getAttribute("title-markunread"); - if (title) - msgDiv.setAttribute("title", title); - } + row.removeClassName("mailer_unreadmail"); + subjectCell.addClassName("mailer_readmailsubject"); + var img = win.$("unreaddiv_" + msguid); + if (img) { + img.removeClassName("mailerUnreadIcon"); + img.addClassName("mailerReadIcon"); + img.setAttribute("id", "readdiv_" + msguid); + img.setAttribute("src", ResourcesURL + "/icon_read.gif"); + var title = img.getAttribute("title-markunread"); + if (title) + img.setAttribute("title", title); + } } else { - msgDiv.removeClassName('mailer_readmailsubject'); - msgDiv.addClassName('mailer_unreadmailsubject'); - msgDiv = win.$("readdiv_" + msguid); - if (msgDiv) - { - msgDiv.setAttribute("class", "mailerReadIcon"); - msgDiv.setAttribute("id", "unreaddiv_" + msguid); - msgDiv.setAttribute("src", ResourcesURL + "/icon_unread.gif"); - msgDiv.setAttribute("onclick", "mailListMarkMessage(this," - + " 'markMessageRead', " + msguid - + ", true);" - +" return false;"); - var title = msgDiv.getAttribute("title-markread"); - if (title) - msgDiv.setAttribute("title", title); - } + row.addClassName("mailer_unreadmail"); + subjectCell.removeClassName('mailer_readmailsubject'); + var img = win.$("readdiv_" + msguid); + if (img) { + img.removeClassName("mailerReadIcon"); + img.addClassName("mailerUnreadIcon"); + img.setAttribute("id", "unreaddiv_" + msguid); + img.setAttribute("src", ResourcesURL + "/icon_unread.gif"); + var title = img.getAttribute("title-markread"); + if (title) + img.setAttribute("title", title); + } } return true; } @@ -123,24 +131,26 @@ function markMailReadInWindow(win, msguid) { /* mail list reply */ function openMessageWindowsForSelection(action, firstOnly) { - if (document.body.hasClassName("popup")) - win = openMessageWindow(window.messageId, - window.messageURL + "/" + action); + if (document.body.hasClassName("popup")) { + var url = window.location.href; + var parts = url.split("/"); + parts[parts.length-1] = action; + window.location.href = parts.join("/"); + } else { var messageList = $("messageList"); var rows = messageList.getSelectedRowsId(); if (rows.length > 0) { - if (firstOnly) - openMessageWindow(rows[0].substr(4), - ApplicationBaseURL + currentMailbox - + "/" + rows[0].substr(4) + for (var i = 0; i < rows.length; i++) { + openMessageWindow(rows[i].substr(4), + ApplicationBaseURL + Mailer.currentMailbox + + "/" + rows[i].substr(4) + "/" + action); - else - for (var i = 0; i < rows.length; i++) - openMessageWindow(rows[i].substr(4), - ApplicationBaseURL + currentMailbox - + "/" + rows[i].substr(4) - + "/" + action); + if (firstOnly) + break; + } + } else { + window.alert(labels["Please select a message."]); } } @@ -148,25 +158,36 @@ function openMessageWindowsForSelection(action, firstOnly) { } function mailListMarkMessage(event) { - var http = createHTTPClient(); - var url = ApplicationBaseURL + currentMailbox + "/" + msguid + "/" + action; + var msguid = this.id.split('_')[1]; + var action; + var markread; + if ($(this).hasClassName('mailerUnreadIcon')) { + action = 'markMessageRead'; + markread = true; + } + else { + action = 'markMessageUnread'; + markread = false; + } + var url = ApplicationBaseURL + Mailer.currentMailbox + "/" + msguid + "/" + action; - if (http) { - // TODO: add parameter to signal that we are only interested in OK - http.open("POST", url, false /* not async */); - http.send(""); - if (http.status != 200) { - // TODO: refresh page? - alert("Message Mark Failed: " + http.statusText); - window.location.reload(); + var data = { "window": window, "msguid": msguid, "markread": markread }; + triggerAjaxRequest(url, mailListMarkMessageCallback, data); + + preventDefault(event); + return false; +} + +function mailListMarkMessageCallback(http) { + if (http.readyState == 4) + if (isHttpStatus204(http.status)) { + var data = http.callbackData; + markMailInWindow(data["window"], data["msguid"], data["markread"]); } else { - markMailInWindow(window, msguid, markread); + alert("Message Mark Failed (" + http.status + "): " + http.statusText); + window.location.reload(); } - } - else { - window.location.href = url; - } } /* maillist row highlight */ @@ -190,74 +211,71 @@ function ml_lowlight(sender) { } -/* folder operations */ - -function ctxFolderAdd(sender) { - var folderName; - - folderName = prompt("Foldername: "); - if (folderName == undefined) - return false; - if (folderName == "") - return false; - - // TODO: should use a form-POST or AJAX - window.location.href = "createFolder?name=" + escape(folderName); - return false; -} - -function ctxFolderDelete(sender) { - if (!confirm("Delete current folder?")) - return false; - - // TODO: should use a form-POST or AJAX - window.location.href = "deleteFolder"; - return false; -} - /* bulk delete of messages */ -function uixDeleteSelectedMessages(sender) { - var failCount = 0; +function deleteSelectedMessages(sender) { + var messageList = $("messageList"); + var rowIds = messageList.getSelectedRowsId(); + + if (rowIds.length > 0) { + for (var i = 0; i < rowIds.length; i++) { + var url; + var rowId = rowIds[i].substr(4); + var messageId = Mailer.currentMailbox + "/" + rowId; + url = ApplicationBaseURL + messageId + "/trash"; + deleteMessageRequestCount++; + var data = { "id": rowId, "mailbox": Mailer.currentMailbox, "messageId": messageId }; + triggerAjaxRequest(url, deleteSelectedMessagesCallback, data); + } + } + else + window.alert(labels["Please select a message."]); - var messageList = $("messageList"); - var rowIds = messageList.getSelectedRowsId(); - - for (var i = 0; i < rowIds.length; i++) { - var url, http; - var rowId = rowIds[i].substr(4); - /* send AJAX request (synchronously) */ + return false; +} - var messageId = currentMailbox + "/" + rowId; - url = ApplicationBaseURL + messageId + "/trash"; - http = createHTTPClient(); - http.open("POST", url, false /* not async */); - http.send(""); - if (!isHttpStatus204(http.status)) { /* request failed */ - failCount++; - http = null; - continue; - } else { - deleteCachedMessage(messageId); - if (currentMessages[currentMailbox] == rowId) { +function deleteSelectedMessagesCallback(http) { + if (http.readyState == 4) { + if (isHttpStatus204(http.status)) { + var data = http.callbackData; + deleteCachedMessage(data["messageId"]); + deleteMessageRequestCount--; + if (Mailer.currentMailbox == data["mailbox"]) { var div = $('messageContent'); - div.update(); - currentMessages[currentMailbox] = null; + if (Mailer.currentMessages[Mailer.currentMailbox] == data["id"]) { + div.update(); + Mailer.currentMessages[Mailer.currentMailbox] = null; + } + + var row = $("row_" + data["id"]); + var nextRow = row.next("tr"); + if (!nextRow) + nextRow = row.previous("tr"); + row.parentNode.removeChild(row); +// row.addClassName("deleted"); // when we'll offer "mark as deleted" + + if (deleteMessageRequestCount == 0) { + if (nextRow) { + Mailer.currentMessages[Mailer.currentMailbox] = nextRow.getAttribute("id").substr(4); + nextRow.select(); + loadMessage(Mailer.currentMessages[Mailer.currentMailbox]); + } + } } } - http = null; - - /* remove from page */ - - /* line-through would be nicer, but hiding is OK too */ - var row = $(rowIds[i]); - row.parentNode.removeChild(row); } + else + log ("deleteSelectedMessagesCallback: problem during ajax request " + http.status); +} - if (failCount > 0) - alert("Could not delete " + failCount + " messages!"); - - return false; +function deleteDraft(url) { + /* this is called by UIxMailEditor with window.opener */ + new Ajax.Request(url, { + method: 'post', + onFailure: function(transport) { + log("draftDeleteCallback: problem during ajax request: " + transport.status); + } + }); } function moveMessages(rowIds, folder) { @@ -268,7 +286,7 @@ function moveMessages(rowIds, folder) { /* send AJAX request (synchronously) */ - var messageId = currentMailbox + "/" + rowIds[i]; + var messageId = Mailer.currentMailbox + "/" + rowIds[i]; url = (ApplicationBaseURL + messageId + "/move?tofolder=" + folder); http = createHTTPClient(); @@ -278,10 +296,10 @@ function moveMessages(rowIds, folder) { var row = $("row_" + rowIds[i]); row.parentNode.removeChild(row); deleteCachedMessage(messageId); - if (currentMessages[currentMailbox] == rowIds[i]) { + if (Mailer.currentMessages[Mailer.currentMailbox] == rowIds[i]) { var div = $('messageContent'); div.update(); - currentMessages[currentMailbox] = null; + Mailer.currentMessages[Mailer.currentMailbox] = null; } } else /* request failed */ @@ -299,8 +317,24 @@ function moveMessages(rowIds, folder) { } function onMenuDeleteMessage(event) { - uixDeleteSelectedMessages(); - preventDefault(event); + deleteSelectedMessages(); + preventDefault(event); +} + +function deleteMessage(url, id, mailbox, messageId) { + var data = { "id": id, "mailbox": mailbox, "messageId": messageId }; + deleteMessageRequestCount++; + triggerAjaxRequest(url, deleteSelectedMessagesCallback, data); +} + +function deleteMessageWithDelay(url, id, mailbox, messageId) { + /* this is called by UIxMailPopupView with window.opener */ + setTimeout("deleteMessage('" + + url + "', '" + + id + "', '" + + mailbox + "', '" + + messageId + "')", + 50); } function onPrintCurrentMessage(event) { @@ -331,26 +365,63 @@ function onMailboxTreeItemClick(event) { $("searchValue").value = ""; initCriteria(); - currentMailboxType = this.parentNode.getAttribute("datatype"); - if (currentMailboxType == "account" || currentMailboxType == "additional") { - currentMailbox = mailbox; + Mailer.currentMailboxType = this.parentNode.getAttribute("datatype"); + if (Mailer.currentMailboxType == "account" || Mailer.currentMailboxType == "additional") { + Mailer.currentMailbox = mailbox; $("messageContent").update(); - var body = $("messageList").tBodies[0]; + var table = $("messageList"); + var head = table.tHead; + var body = table.tBodies[0]; for (var i = body.rows.length; i > 0; i--) body.deleteRow(i-1); + if (head.rows[1]) + head.rows[1].firstChild.update(); } else openMailbox(mailbox); - preventDefault(event); + Event.stop(event); } -function onMailboxMenuMove() { - window.alert("unimplemented"); +function _onMailboxMenuAction(menuEntry, error, actionName) { + var targetMailbox = menuEntry.mailbox.fullName(); + var messages = new Array(); + + if (targetMailbox == Mailer.currentMailbox) + window.alert(labels[error]); + else { + if (document.menuTarget.tagName == "DIV") + // Menu called from message content view + messages.push(Mailer.currentMessages[Mailer.currentMailbox]); + else if (Object.isArray(document.menuTarget)) + // Menu called from multiple selection in messages list view + messages = $(document.menuTarget).collect(function(row) { + return row.getAttribute("id").substr(4); + }); + else + // Menu called from one selection in messages list view + messages.push(document.menuTarget.getAttribute("id").substr(4)); + + var url_prefix = URLForFolderID(Mailer.currentMailbox) + "/"; + messages.each(function(msgid, i) { + var url = url_prefix + msgid + "/" + actionName + + "?folder=" + targetMailbox; + triggerAjaxRequest(url, folderRefreshCallback, + ((i == messages.size() - 1)?Mailer.currentMailbox:"")); + }); + } } -function onMailboxMenuCopy() { - window.alert("unimplemented"); +function onMailboxMenuMove(event) { + _onMailboxMenuAction(this, + "Moving a message into its own folder is impossible!", + "move"); +} + +function onMailboxMenuCopy(event) { + _onMailboxMenuAction(this, + "Copying a message into its own folder is impossible!", + "copy"); } function refreshMailbox() { @@ -370,24 +441,30 @@ function onComposeMessage() { } function composeNewMessage() { - var account = currentMailbox.split("/")[1]; + var account = Mailer.currentMailbox.split("/")[1]; var url = ApplicationBaseURL + "/" + account + "/compose"; openMailComposeWindow(url); } function openMailbox(mailbox, reload, idx) { - if (mailbox != currentMailbox || reload) { - currentMailbox = mailbox; - var url = ApplicationBaseURL + mailbox + "/view?noframe=1"; - var messageContent = $("messageContent"); - messageContent.update(); - + if (mailbox != Mailer.currentMailbox || reload) { + Mailer.currentMailbox = mailbox; + var url = ApplicationBaseURL + encodeURI(mailbox) + "/view?noframe=1"; + + if (!reload || idx) { + var messageContent = $("messageContent"); + messageContent.update(); + lastClickedRow = -1; // from generic.js + } + var currentMessage; + if (!idx) { - currentMessage = currentMessages[mailbox]; + currentMessage = Mailer.currentMessages[mailbox]; if (currentMessage) { - loadMessage(currentMessage); url += '&pageforuid=' + currentMessage; + if (!reload) + loadMessage(currentMessage); } } @@ -401,6 +478,7 @@ function openMailbox(mailbox, reload, idx) { + "&asc=" + sorting["ascending"]); if (idx) url += "&idx=" + idx; + if (document.messageListAjaxRequest) { document.messageListAjaxRequest.aborted = true; document.messageListAjaxRequest.abort(); @@ -415,7 +493,6 @@ function openMailbox(mailbox, reload, idx) { + rightDragHandle.offsetHeight + 'px') }); } - document.messageListAjaxRequest = triggerAjaxRequest(url, messageListCallback, currentMessage); @@ -427,41 +504,66 @@ function openMailbox(mailbox, reload, idx) { } function openMailboxAtIndex(event) { - openMailbox(currentMailbox, true, this.getAttribute("idx")); + openMailbox(Mailer.currentMailbox, true, this.getAttribute("idx")); - preventDefault(event); + Event.stop(event); } function messageListCallback(http) { var div = $('mailboxContent'); - + var table = $('messageList'); + if (http.readyState == 4 && http.status == 200) { - document.messageListAjaxRequest = null; - div.update(http.responseText); - - TableKit.Resizable.init($('messageList')); + document.messageListAjaxRequest = null; + + if (table) { + // Update table + var thead = table.tHead; + var addressHeaderCell = thead.rows[0].cells[3]; + var tbody = table.tBodies[0]; + var tmp = document.createElement('div'); + $(tmp).update(http.responseText); + thead.rows[1].parentNode.replaceChild(tmp.firstChild.tHead.rows[1], thead.rows[1]); + addressHeaderCell.replaceChild(tmp.firstChild.tHead.rows[0].cells[3].lastChild, + addressHeaderCell.lastChild); + table.replaceChild(tmp.firstChild.tBodies[0], tbody); + } + else { + // Add table + div.update(http.responseText); + table = $('messageList'); + configureMessageListEvents(table); + TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true}); + } + configureMessageListBodyEvents(table); var selected = http.callbackData; if (selected) { var row = $("row_" + selected); - if (row) + if (row) { row.select(); + lastClickedRow = row.rowIndex - $(row).up('table').down('thead').getElementsByTagName('tr').length; + var rowPosition = row.rowIndex * row.getHeight(); + if ($(row).up('div').getHeight() > rowPosition) + rowPosition = 0; + div.scrollTop = rowPosition; // scroll to selected message + } + else + $("messageContent").update(); } - configureMessageListEvents(); + else + div.scrollTop = 0; if (sorting["attribute"] && sorting["attribute"].length > 0) { - var sortHeader; - if (sorting["attribute"] == "subject") - sortHeader = $("subjectHeader"); - else if (sorting["attribute"] == "from") - sortHeader = $("fromHeader"); - else if (sorting["attribute"] == "date") - sortHeader = $("dateHeader"); - else - sortHeader = null; - + var sortHeader = $(sorting["attribute"] + "Header"); + if (sortHeader) { + var sortImages = $(table.tHead).getElementsByClassName("sortImage"); + $(sortImages).each(function(item) { + item.remove(); + }); + var sortImage = createElement("img", "messageSortImage", "sortImage"); sortHeader.insertBefore(sortImage, sortHeader.firstChild); if (sorting["ascending"]) @@ -471,8 +573,11 @@ function messageListCallback(http) { } } } - else - log("messageListCallback: problem during ajax request (readyState = " + http.readyState + ", status = " + http.status + ")"); + else { + var data = http.responseText; + var msg = data.replace(/^(.*\n)*.*

((.*\n)*.*)<\/p>(.*\n)*.*$/, "$2"); + log("messageListCallback: problem during ajax request (readyState = " + http.readyState + ", status = " + http.status + ", response = " + msg + ")"); + } } function quotasCallback(http) { @@ -480,15 +585,20 @@ function quotasCallback(http) { && http.status == 200) { var hasQuotas = false; - var quotas = http.responseText.evalJSON(true); - for (var i in quotas) { - hasQuotas = true; - break; + if (http.responseText.length > 0) { + var quotas = http.responseText.evalJSON(true); + for (var i in quotas) { + hasQuotas = true; + break; + } } - + if (hasQuotas) { - var treePath = currentMailbox.split("/"); - var mbQuotas = quotas["/" + treePath[2]]; + var treePath = Mailer.currentMailbox.split("/"); + var quotasMB = new Array(); + for (var i = 2; i < treePath.length; i++) + quotasMB.push(treePath[i].substr(6)); + var mbQuotas = quotas["/" + quotasMB.join("/")]; var used = mbQuotas["usedSpace"]; var max = mbQuotas["maxQuota"]; var percents = (Math.round(used * 10000 / max) / 100); @@ -501,16 +611,15 @@ function quotasCallback(http) { function onMessageContextMenu(event) { var menu = $('messageListMenu'); - Event.observe(menu, "hideMenu", onMessageContextMenuHide); - popupMenu(event, "messageListMenu", this); - var topNode = $('messageList'); var selectedNodes = topNode.getSelectedRows(); - for (var i = 0; i < selectedNodes.length; i++) - selectedNodes[i].deselect(); - topNode.menuSelectedRows = selectedNodes; - topNode.menuSelectedEntry = this; - this.select(); + + Event.observe(menu, "hideMenu", onMessageContextMenuHide); + + if (selectedNodes.length > 1) + popupMenu(event, "messagesListMenu", selectedNodes); + else + popupMenu(event, "messageListMenu", this); } function onMessageContextMenuHide(event) { @@ -576,11 +685,11 @@ function deleteCachedMessage(messageId) { var done = false; var counter = 0; - while (counter < cachedMessages.length + while (counter < Mailer.cachedMessages.length && !done) - if (cachedMessages[counter] - && cachedMessages[counter]['idx'] == messageId) { - cachedMessages.splice(counter, 1); + if (Mailer.cachedMessages[counter] + && Mailer.cachedMessages[counter]['idx'] == messageId) { + Mailer.cachedMessages.splice(counter, 1); done = true; } else @@ -591,11 +700,11 @@ function getCachedMessage(idx) { var message = null; var counter = 0; - while (counter < cachedMessages.length + while (counter < Mailer.cachedMessages.length && message == null) - if (cachedMessages[counter] - && cachedMessages[counter]['idx'] == currentMailbox + '/' + idx) - message = cachedMessages[counter]; + if (Mailer.cachedMessages[counter] + && Mailer.cachedMessages[counter]['idx'] == Mailer.currentMailbox + '/' + idx) + message = Mailer.cachedMessages[counter]; else counter++; @@ -607,14 +716,14 @@ function storeCachedMessage(cachedMessage) { var timeOldest = -1; var counter = 0; - if (cachedMessages.length < maxCachedMessages) - oldest = cachedMessages.length; + if (Mailer.cachedMessages.length < Mailer.maxCachedMessages) + oldest = Mailer.cachedMessages.length; else { - while (cachedMessages[counter]) { + while (Mailer.cachedMessages[counter]) { if (oldest == -1 - || cachedMessages[counter]['time'] < timeOldest) { + || Mailer.cachedMessages[counter]['time'] < timeOldest) { oldest = counter; - timeOldest = cachedMessages[counter]['time']; + timeOldest = Mailer.cachedMessages[counter]['time']; } counter++; } @@ -623,7 +732,7 @@ function storeCachedMessage(cachedMessage) { oldest = 0; } - cachedMessages[oldest] = cachedMessage; + Mailer.cachedMessages[oldest] = cachedMessage; } function onMessageSelectionChange() { @@ -631,9 +740,8 @@ function onMessageSelectionChange() { if (rows.length == 1) { var idx = rows[0].substr(4); - - if (currentMessages[currentMailbox] != idx) { - currentMessages[currentMailbox] = idx; + if (Mailer.currentMessages[Mailer.currentMailbox] != idx) { + Mailer.currentMessages[Mailer.currentMailbox] = idx; loadMessage(idx); } } @@ -647,18 +755,19 @@ function loadMessage(idx) { var cachedMessage = getCachedMessage(idx); + markMailInWindow(window, idx, true); if (cachedMessage == null) { - var url = (ApplicationBaseURL + currentMailbox + "/" + var url = (ApplicationBaseURL + Mailer.currentMailbox + "/" + idx + "/view?noframe=1"); document.messageAjaxRequest = triggerAjaxRequest(url, messageCallback, idx); - markMailInWindow(window, idx, true); } else { var div = $('messageContent'); div.update(cachedMessage['text']); cachedMessage['time'] = (new Date()).getTime(); document.messageAjaxRequest = null; configureLinksInMessage(); + resizeMailContent(); } } @@ -666,26 +775,90 @@ function configureLinksInMessage() { var messageDiv = $('messageContent'); var mailContentDiv = document.getElementsByClassName('mailer_mailcontent', messageDiv)[0]; - Event.observe(mailContentDiv, "contextmenu", - onMessageContentMenu.bindAsEventListener(mailContentDiv)); + if (!document.body.hasClassName("popup")) + mailContentDiv.observe("contextmenu", onMessageContentMenu); + var anchors = messageDiv.getElementsByTagName('a'); for (var i = 0; i < anchors.length; i++) if (anchors[i].href.substring(0,7) == "mailto:") { - Event.observe(anchors[i], "click", - onEmailAddressClick.bindAsEventListener(anchors[i])); - Event.observe(anchors[i], "contextmenu", - onEmailAddressClick.bindAsEventListener(anchors[i])); + $(anchors[i]).observe("click", onEmailTo); + $(anchors[i]).observe("contextmenu", onEmailAddressClick); } else - Event.observe(anchors[i], "click", - onMessageAnchorClick); + $(anchors[i]).observe("click", onMessageAnchorClick); + + var images = messageDiv.getElementsByTagName('img'); + for (var i = 0; i < images.length; i++) + $(images[i]).observe("contextmenu", onImageClick); var editDraftButton = $("editDraftButton"); if (editDraftButton) - Event.observe(editDraftButton, "click", onMessageEditDraft); + Event.observe(editDraftButton, "click", + onMessageEditDraft.bindAsEventListener(editDraftButton)); + + configureiCalLinksInMessage(); +} + +function configureiCalLinksInMessage() { + var buttons = { "iCalendarAccept": "accept", + "iCalendarDecline": "decline", + "iCalendarTentative": "tentative", + "iCalendarUpdateUserStatus": "updateUserStatus", + "iCalendarAddToCalendar": "addToCalendar", + "iCalendarDeleteFromCalendar": "deleteFromCalendar" }; + + for (var key in buttons) { + var button = $(key); + if (button) { + button.action = buttons[key]; + Event.observe(button, "click", + onICalendarButtonClick.bindAsEventListener(button)); + } + } +} + +function onICalendarButtonClick(event) { + var link = $("iCalendarAttachment").value; + if (link) { + var urlstr = link + "/" + this.action; + triggerAjaxRequest(urlstr, ICalendarButtonCallback, + Mailer.currentMailbox + "/" + + Mailer.currentMessages[Mailer.currentMailbox]); + } + else + log("no link"); +} + +function ICalendarButtonCallback(http) { + if (http.readyState == 4) + if (isHttpStatus204(http.status)) { + var oldMsg = http.callbackData; + var msg = Mailer.currentMailbox + "/" + Mailer.currentMessages[Mailer.currentMailbox]; + if (oldMsg == msg) { + deleteCachedMessage(oldMsg); + loadMessage(Mailer.currentMessages[Mailer.currentMailbox]); + } + } + else { + window.alert("received code: " + http.status); + } +} + +function resizeMailContent() { + var headerTable = document.getElementsByClassName('mailer_fieldtable')[0]; + var contentDiv = document.getElementsByClassName('mailer_mailcontent')[0]; + + contentDiv.setStyle({ 'top': + (Element.getHeight(headerTable) + headerTable.offsetTop) + 'px' }); } function onMessageContentMenu(event) { + var element = getTarget(event); + if ((element.tagName == 'A' && element.href.substring(0,7) == "mailto:") + || element.tagName == 'IMG') + // Don't show the default contextual menu; let the click propagate to + // other observers + return true; popupMenu(event, 'messageContentMenu', this); } @@ -695,13 +868,21 @@ function onMessageEditDraft(event) { function onEmailAddressClick(event) { popupMenu(event, 'addressMenu', this); + preventDefault(event); + return false; } -function onMessageAnchorClick (event) { +function onMessageAnchorClick(event) { window.open(this.href); preventDefault(event); } +function onImageClick(event) { + popupMenu(event, 'imageMenu', this); + preventDefault(event); + return false; +} + function messageCallback(http) { var div = $('messageContent'); @@ -710,10 +891,11 @@ function messageCallback(http) { document.messageAjaxRequest = null; div.update(http.responseText); configureLinksInMessage(); - + resizeMailContent(); + if (http.callbackData) { var cachedMessage = new Array(); - cachedMessage['idx'] = currentMailbox + '/' + http.callbackData; + cachedMessage['idx'] = Mailer.currentMailbox + '/' + http.callbackData; cachedMessage['time'] = (new Date()).getTime(); cachedMessage['text'] = http.responseText; if (cachedMessage['text'].length < 30000) @@ -776,9 +958,6 @@ function moveTo(uri) { alert("MoveTo: " + uri); } -function deleteSelectedMails() { -} - /* message menu entries */ function onMenuOpenMessage(event) { return openMessageWindowsForSelection('popupview'); @@ -801,7 +980,7 @@ function onMenuViewMessageSource(event) { var rows = messageList.getSelectedRowsId(); if (rows.length > 0) { - var url = (ApplicationBaseURL + currentMailbox + "/" + var url = (ApplicationBaseURL + Mailer.currentMailbox + "/" + rows[0].substr(4) + "/viewsource"); openMailComposeWindow(url); } @@ -809,6 +988,14 @@ function onMenuViewMessageSource(event) { preventDefault(event); } +function saveImage(event) { + var img = document.menuTarget; + var url = img.getAttribute("src"); + var urlAsAttachment = url.replace(/(\/[^\/]*)$/,"/asAttachment$1"); + + window.location.href = urlAsAttachment; +} + /* contacts */ function newContactFromEmail(event) { var mailto = document.menuTarget.innerHTML; @@ -826,6 +1013,12 @@ function newContactFromEmail(event) { return false; /* stop following the link */ } +function onEmailTo(event) { + openMailTo(this.innerHTML.strip()); + preventDefault(event); + return false; +} + function newEmailTo(sender) { return openMailTo(document.menuTarget.innerHTML); } @@ -847,6 +1040,9 @@ function expandUpperTree(node) { } function onHeaderClick(event) { + if (TableKit.Resizable._onHandle) + return; + var headerId = this.getAttribute("id"); var newSortAttribute; if (headerId == "subjectHeader") @@ -864,18 +1060,18 @@ function onHeaderClick(event) { sorting["attribute"] = newSortAttribute; sorting["ascending"] = true; } - refreshCurrentFolder(); - + Event.stop(event); } function refreshCurrentFolder() { - openMailbox(currentMailbox, true); + openMailbox(Mailer.currentMailbox, true); } -function pouetpouet(event) { - window.alert("pouet pouet"); +function refreshFolderByType(type) { + if (Mailer.currentMailboxType == type) + refreshCurrentFolder(); } var mailboxSpanAcceptType = function(type) { @@ -895,21 +1091,21 @@ var mailboxSpanDrop = function(data) { if (data) { var folder = this.parentNode.parentNode.getAttribute("dataname"); - if (folder != currentMailbox) + if (folder != Mailer.currentMailbox) success = (moveMessages(data, folder) == 0); } else success = false; - + return success; } - + var plusSignEnter = function() { var nodeNr = parseInt(this.id.substr(2)); if (!mailboxTree.aNodes[nodeNr]._io) this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000); } - + var plusSignExit = function() { if (this.plusSignTimer) { clearTimeout(this.plusSignTimer); @@ -955,40 +1151,37 @@ var messageListData = function(type) { } /* a model for a futur refactoring of the sortable table headers mechanism */ - -function configureMessageListHeaders(cells) { - for (var i = 0; i < cells.length; i++) { - var currentCell = $(cells[i]); - Event.observe(currentCell, "click", - onHeaderClick.bindAsEventListener(currentCell)); - //Event.observe(currentCell, "mousedown", listRowMouseDownHandler); +function configureMessageListEvents(table) { + if (table) { + table.multiselect = true; + // Each body row can load a message + Event.observe(table, "mousedown", + onMessageSelectionChange.bindAsEventListener(table)); + // Sortable columns + configureSortableTableHeaders(table); } } -function configureMessageListEvents() { - var messageList = $("messageList"); - if (messageList) { - Event.observe(messageList, "mousedown", - onMessageSelectionChange.bindAsEventListener(messageList)); - - configureMessageListHeaders(messageList.tHead.rows[0].cells); - - var cell = messageList.tHead.rows[1].cells[0]; +function configureMessageListBodyEvents(table) { + if (table) { + // Page navigation + var cell = table.tHead.rows[1].cells[0]; if ($(cell).hasClassName("tbtv_navcell")) { var anchors = $(cell).childNodesWithTag("a"); for (var i = 0; i < anchors.length; i++) Event.observe(anchors[i], "click", openMailboxAtIndex.bindAsEventListener(anchors[i])); } - rows = messageList.tBodies[0].rows; + rows = table.tBodies[0].rows; for (var i = 0; i < rows.length; i++) { Event.observe(rows[i], "mousedown", onRowClick); + Event.observe(rows[i], "selectstart", listRowMouseDownHandler); Event.observe(rows[i], "contextmenu", onMessageContextMenu.bindAsEventListener(rows[i])); - + rows[i].dndTypes = function() { return new Array("mailRow"); }; rows[i].dndGhost = messageListGhost; rows[i].dndDataForType = messageListData; - document.DNDManager.registerSource(rows[i]); +// document.DNDManager.registerSource(rows[i]); for (var j = 0; j < rows[i].cells.length; j++) { var cell = rows[i].cells[j]; @@ -997,7 +1190,7 @@ function configureMessageListEvents() { Event.observe(cell, "dblclick", onMessageDoubleClick.bindAsEventListener(cell)); else if (j == 4) { var img = cell.childNodesWithTag("img")[0]; - Event.observe(img, "click", mailListMarkMessage); + Event.observe(img, "click", mailListMarkMessage.bindAsEventListener(img)); } } } @@ -1062,12 +1255,37 @@ function openInbox(node) { } function initMailer(event) { - if (!document.body.hasClassName("popup")) { - initDnd(); + if (!$(document.body).hasClassName("popup")) { +// initDnd(); initMailboxTree(); + initMessageCheckTimer(); + } + + // Default sort options + sorting["attribute"] = "date"; + sorting["ascending"] = false; +} + +function initMessageCheckTimer() { + var messageCheck = userDefaults["MessageCheck"]; + if (messageCheck && messageCheck != "manually") { + var interval; + if (messageCheck == "once_per_hour") + interval = 3600; + else if (messageCheck == "every_minute") + interval = 60; + else { + interval = parseInt(messageCheck.substr(6)) * 60; + } + messageCheckTimer = window.setInterval(onMessageCheckCallback, + interval * 1000); } } +function onMessageCheckCallback(event) { + refreshMailbox(); +} + function initMailboxTree() { mailboxTree = new dTree("mailboxTree"); mailboxTree.config.folderLinks = true; @@ -1093,7 +1311,7 @@ function initMailboxTree() { mailboxTree.pendingRequests = mailAccounts.length; activeAjaxRequests += mailAccounts.length; for (var i = 0; i < mailAccounts.length; i++) { - var url = ApplicationBaseURL + "/" + mailAccounts[i] + "/mailboxes"; + var url = ApplicationBaseURL + mailAccounts[i] + "/mailboxes"; triggerAjaxRequest(url, onLoadMailboxesCallback, mailAccounts[i]); } } @@ -1105,10 +1323,13 @@ function updateMailboxTreeInPage() { var tree = $("mailboxTree"); var nodes = document.getElementsByClassName("node", tree); for (i = 0; i < nodes.length; i++) { - Event.observe(nodes[i], "click", onMailboxTreeItemClick.bindAsEventListener(nodes[i])); - Event.observe(nodes[i], "contextmenu", onFolderMenuClick.bindAsEventListener(nodes[i])); + Event.observe(nodes[i], "click", + onMailboxTreeItemClick.bindAsEventListener(nodes[i])); + Event.observe(nodes[i], "contextmenu", + onFolderMenuClick.bindAsEventListener(nodes[i])); if (!inboxFound && nodes[i].parentNode.getAttribute("datatype") == "inbox") { + Mailer.currentMailboxType = "inbox"; openInbox(nodes[i]); inboxFound = true; } @@ -1123,7 +1344,10 @@ function mailboxMenuNode(type, name) { var image = document.createElement("img"); image.src = ResourcesURL + "/" + icon; newNode.appendChild(image); - newNode.appendChild(document.createTextNode(" " + name)); + var displayName = MailerUIdTreeExtension.folderNames[type]; + if (!displayName) + displayName = name; + newNode.appendChild(document.createTextNode(" " + displayName)); return newNode; } @@ -1134,12 +1358,13 @@ function generateMenuForMailbox(mailbox, prefix, callback) { menuDIV.setAttribute("id", prefix + "Submenu"); var menu = document.createElement("ul"); menuDIV.appendChild(menu); + pageContent.appendChild(menuDIV); var callbacks = new Array(); if (mailbox.type != "account") { var newNode = document.createElement("li"); newNode.mailbox = mailbox; - newNode.appendChild(document.createTextNode("coucou")); + newNode.appendChild(document.createTextNode(labels["This Folder"])); menu.appendChild(newNode); menu.appendChild(document.createElement("li")); callbacks.push(callback); @@ -1153,11 +1378,8 @@ function generateMenuForMailbox(mailbox, prefix, callback) { menu.appendChild(newNode); if (child.children.length > 0) { var newPrefix = prefix + submenuCount; - var newSubmenu = generateMenuForMailbox(child, - newPrefix, - callback); - document.body.appendChild(newSubmenu); - callbacks.push(newPrefix + "Submenu"); + var newSubmenuId = generateMenuForMailbox(child, newPrefix, callback); + callbacks.push(newSubmenuId); submenuCount++; } else { @@ -1167,7 +1389,7 @@ function generateMenuForMailbox(mailbox, prefix, callback) { } initMenu(menuDIV, callbacks); - return menuDIV; + return menuDIV.getAttribute("id"); } function updateMailboxMenus() { @@ -1181,23 +1403,23 @@ function updateMailboxMenus() { menuDIV.parentNode.removeChild(menuDIV); menuDIV = document.createElement("div"); - document.body.appendChild(menuDIV); + pageContent = $("pageContent"); + pageContent.appendChild(menuDIV); var menu = document.createElement("ul"); menuDIV.appendChild(menu); $(menuDIV).addClassName("menu"); menuDIV.setAttribute("id", menuId); - + var submenuIds = new Array(); for (var i = 0; i < mailAccounts.length; i++) { var menuEntry = mailboxMenuNode("account", mailAccounts[i]); menu.appendChild(menuEntry); var mailbox = accounts[mailAccounts[i]]; - var newSubmenu = generateMenuForMailbox(mailbox, - key, mailboxActions[key]); - document.body.appendChild(newSubmenu); - submenuIds.push(newSubmenu.getAttribute("id")); + var newSubmenuId = generateMenuForMailbox(mailbox, + key, mailboxActions[key]); + submenuIds.push(newSubmenuId); } initMenu(menuDIV, submenuIds); } @@ -1207,16 +1429,19 @@ function onLoadMailboxesCallback(http) { if (http.readyState == 4 && http.status == 200) { checkAjaxRequestsState(); - var newAccount = buildMailboxes(http.callbackData, - http.responseText); - accounts[http.callbackData] = newAccount; - mailboxTree.addMailAccount(newAccount); - mailboxTree.pendingRequests--; - activeAjaxRequests--; - if (!mailboxTree.pendingRequests) { - updateMailboxTreeInPage(); - updateMailboxMenus(); - checkAjaxRequestsState(); + if (http.responseText.length > 0) { + var newAccount = buildMailboxes(http.callbackData, + http.responseText); + accounts[http.callbackData] = newAccount; + mailboxTree.addMailAccount(newAccount); + mailboxTree.pendingRequests--; + activeAjaxRequests--; + if (!mailboxTree.pendingRequests) { + updateMailboxTreeInPage(); + updateMailboxMenus(); + checkAjaxRequestsState(); + getFoldersState(); + } } } @@ -1224,7 +1449,7 @@ function onLoadMailboxesCallback(http) { // var treeNodes = document.getElementsByClassName("dTreeNode", tree); // var i = 0; // while (i < treeNodes.length - // && treeNodes[i].getAttribute("dataname") != currentMailbox) + // && treeNodes[i].getAttribute("dataname") != Mailer.currentMailbox) // i++; // if (i < treeNodes.length) { // // log("found mailbox"); @@ -1264,6 +1489,45 @@ function buildMailboxes(accountName, encoded) { return account; } +function getFoldersState() { + if (mailAccounts.length > 0) { + var urlstr = ApplicationBaseURL + "foldersState"; + triggerAjaxRequest(urlstr, getFoldersStateCallback); + } +} + +function getFoldersStateCallback(http) { + if (http.readyState == 4 + && http.status == 200) { + if (http.responseText.length > 0) { + // The response text is a JSOn representation + // of the folders that were left opened. + var data = http.responseText.evalJSON(true); + for (var i = 1; i < mailboxTree.aNodes.length; i++) { + if ($(data).indexOf(mailboxTree.aNodes[i].dataname) > 0) + // If the folder is found, open it + mailboxTree.o(i); + } + } + } + mailboxTree.autoSync(); +} + +function saveFoldersState() { + if (mailAccounts.length > 0) { + var foldersState = mailboxTree.getFoldersState(); + var urlstr = ApplicationBaseURL + "saveFoldersState" + "?expandedFolders=" + foldersState; + triggerAjaxRequest(urlstr, saveFoldersStateCallback); + } +} + +function saveFoldersStateCallback(http) { + if (http.readyState == 4 + && isHttpStatus204(http.status)) { + log ("folders state saved"); + } +} + function onMenuCreateFolder(event) { var name = window.prompt(labels["Name :"], ""); if (name && name.length > 0) { @@ -1296,28 +1560,127 @@ function onMenuDeleteFolder(event) { function onMenuExpungeFolder(event) { var folderID = document.menuTarget.getAttribute("dataname"); var urlstr = URLForFolderID(folderID) + "/expunge"; - triggerAjaxRequest(urlstr, folderRefreshCallback, folderID); } function onMenuEmptyTrash(event) { var folderID = document.menuTarget.getAttribute("dataname"); var urlstr = URLForFolderID(folderID) + "/emptyTrash"; - triggerAjaxRequest(urlstr, folderRefreshCallback, folderID); + triggerAjaxRequest(urlstr, folderOperationCallback, folderID); - if (folderID == currentMailbox) { + if (folderID == Mailer.currentMailbox) { var div = $('messageContent'); for (var i = div.childNodes.length - 1; i > -1; i--) div.removeChild(div.childNodes[i]); + refreshCurrentFolder(); } - var msgID = currentMessages[folderID]; + var msgID = Mailer.currentMessages[folderID]; if (msgID) deleteCachedMessage(folderID + "/" + msgID); } +function _onMenuChangeToXXXFolder(event, folder) { + var type = document.menuTarget.getAttribute("datatype"); + if (type == "additional") + window.alert(labels["You need to choose a non-virtual folder!"]); + else { + var folderID = document.menuTarget.getAttribute("dataname"); + var urlstr = URLForFolderID(folderID) + "/setAs" + folder + "Folder"; + triggerAjaxRequest(urlstr, folderOperationCallback); + } +} + +function onMenuChangeToDraftsFolder(event) { + return _onMenuChangeToXXXFolder(event, "Drafts"); +} + +function onMenuChangeToSentFolder(event) { + return _onMenuChangeToXXXFolder(event, "Sent"); +} + +function onMenuChangeToTrashFolder(event) { + return _onMenuChangeToXXXFolder(event, "Trash"); +} + +function onMenuLabelNone() { + var messages = new Array(); + + if (document.menuTarget.tagName == "DIV") + // Menu called from message content view + messages.push(Mailer.currentMessages[Mailer.currentMailbox]); + else if (Object.isArray(document.menuTarget)) + // Menu called from multiple selection in messages list view + $(document.menuTarget).collect(function(row) { + messages.push(row.getAttribute("id").substr(4)); + }); + else + // Menu called from one selection in messages list view + messages.push(document.menuTarget.getAttribute("id").substr(4)); + + var url = ApplicationBaseURL + Mailer.currentMailbox + "/"; + messages.each(function(id) { + triggerAjaxRequest(url + id + "/removeAllLabels", + messageFlagCallback, + { mailbox: Mailer.currentMailbox, msg: id, label: null } ); + }); +} + +function _onMenuLabelFlagX(flag) { + var messages = new Hash(); + + if (document.menuTarget.tagName == "DIV") + // Menu called from message content view + messages.set(Mailer.currentMessages[Mailer.currentMailbox], + $('tr#row_' + Mailer.currentMessages[Mailer.currentMailbox]).getAttribute("labels")); + else if (Object.isArray(document.menuTarget)) + // Menu called from multiple selection in messages list view + $(document.menuTarget).collect(function(row) { + messages.set(row.getAttribute("id").substr(4), + row.getAttribute("labels")); + }); + else + // Menu called from one selection in messages list view + messages.set(document.menuTarget.getAttribute("id").substr(4), + document.menuTarget.getAttribute("labels")); + + var url = ApplicationBaseURL + Mailer.currentMailbox + "/"; + messages.keys().each(function(id) { + var flags = messages.get(id).split(" "); + var operation = "add"; + + if (flags.indexOf("label" + flag) > -1) + operation = "remove"; + + triggerAjaxRequest(url + id + "/" + operation + "Label" + flag, + messageFlagCallback, + { mailbox: Mailer.currentMailbox, msg: id, + label: operation + flag } ); + }); +} + +function onMenuLabelFlag1() { + _onMenuLabelFlagX(1); +} + +function onMenuLabelFlag2() { + _onMenuLabelFlagX(2); +} + +function onMenuLabelFlag3() { + _onMenuLabelFlagX(3); +} + +function onMenuLabelFlag4() { + _onMenuLabelFlagX(4); +} + +function onMenuLabelFlag5() { + _onMenuLabelFlagX(5); +} + function folderOperationCallback(http) { if (http.readyState == 4 - && http.status == 204) + && isHttpStatus204(http.status)) initMailboxTree(); else window.alert(labels["Operation failed"]); @@ -1325,15 +1688,73 @@ function folderOperationCallback(http) { function folderRefreshCallback(http) { if (http.readyState == 4 - && http.status == 204) { + && isHttpStatus204(http.status)) { var oldMailbox = http.callbackData; - if (oldMailbox == currentMailbox) + if (oldMailbox == Mailer.currentMailbox) refreshCurrentFolder(); } else window.alert(labels["Operation failed"]); } +function messageFlagCallback(http) { + if (http.readyState == 4 + && isHttpStatus204(http.status)) { + var data = http.callbackData; + if (data["mailbox"] == Mailer.currentMailbox) { + var row = $("row_" + data["msg"]); + var operation = data["label"]; + if (operation) { + var labels = row.getAttribute("labels"); + var flags; + if (labels.length > 0) + flags = labels.split(" "); + else + flags = new Array(); + if (operation.substr(0, 3) == "add") + flags.push("label" + operation.substr(3)); + else { + var flag = "label" + operation.substr(6); + var idx = flags.indexOf(flag); + flags.splice(idx, 1); + } + row.setAttribute("labels", flags.join(" ")); + } + else + row.setAttribute("labels", ""); + } + } +} + +function onLabelMenuPrepareVisibility() { + var messageList = $("messageList"); + var flags = {}; + + if (messageList) { + var rows = messageList.getSelectedRows(); + for (var i = 0; i < rows.length; i++) { + $w(rows[i].getAttribute("labels")).each(function(flag) { + flags[flag] = true; + }); + } + } + + var lis = this.childNodesWithTag("ul")[0].childNodesWithTag("li") + var isFlagged = false; + for (var i = 1; i < 6; i++) { + if (flags["label" + i]) { + isFlagged = true; + lis[1 + i].addClassName("_chosen"); + } + else + lis[1 + i].removeClassName("_chosen"); + } + if (isFlagged) + lis[0].removeClassName("_chosen"); + else + lis[0].addClassName("_chosen"); +} + function getMenus() { var menus = {} menus["accountIconMenu"] = new Array(null, null, onMenuCreateFolder, null, @@ -1350,7 +1771,9 @@ function getMenus() { onMenuCreateFolder, onMenuRenameFolder, onMenuExpungeFolder, - onMenuDeleteFolder, "-", null, + onMenuDeleteFolder, + "folderTypeMenu", + "-", null, onMenuSharing); menus["addressMenu"] = new Array(newContactFromEmail, newEmailTo, null); menus["messageListMenu"] = new Array(onMenuOpenMessage, "-", @@ -1362,6 +1785,13 @@ function getMenus() { "mark-menu", "-", null, onMenuViewMessageSource, null, null, onMenuDeleteMessage); + menus["messagesListMenu"] = new Array(onMenuForwardMessage, + "-", "moveMailboxMenu", + "copyMailboxMenu", "label-menu", + "mark-menu", "-", + null, null, + onMenuDeleteMessage); + menus["imageMenu"] = new Array(saveImage); menus["messageContentMenu"] = new Array(onMenuReplyToSender, onMenuReplyToAll, onMenuForwardMessage, @@ -1372,18 +1802,26 @@ function getMenus() { null, onMenuViewMessageSource, null, onPrintCurrentMessage, onMenuDeleteMessage); - menus["label-menu"] = new Array(null, "-", null , null, null, null , null, - null); + menus["folderTypeMenu"] = new Array(onMenuChangeToSentFolder, + onMenuChangeToDraftsFolder, + onMenuChangeToTrashFolder); + + menus["label-menu"] = new Array(onMenuLabelNone, "-", onMenuLabelFlag1, + onMenuLabelFlag2, onMenuLabelFlag3, + onMenuLabelFlag4, onMenuLabelFlag5); menus["mark-menu"] = new Array(null, null, null, null, "-", null, "-", null, null, null); menus["searchMenu"] = new Array(setSearchCriteria, setSearchCriteria, setSearchCriteria, setSearchCriteria, setSearchCriteria); + var labelMenu = $("label-menu"); + if (labelMenu) + labelMenu.prepareVisibility = onLabelMenuPrepareVisibility; return menus; } -addEvent(window, 'load', initMailer); +FastInit.addOnLoad(initMailer); function Mailbox(type, name) { this.type = type; @@ -1402,6 +1840,18 @@ Mailbox.prototype.dump = function(indent) { } } +Mailbox.prototype.fullName = function() { + var fullName = ""; + + var currentFolder = this; + while (currentFolder.parentFolder) { + fullName = "/folder" + currentFolder.name + fullName; + currentFolder = currentFolder.parentFolder; + } + + return "/" + currentFolder.name + fullName; +} + Mailbox.prototype.findMailboxByName = function(name) { var mailbox = null;