X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=UI%2FWebServerResources%2FMailerUI.js;h=f2568018bc7b9f031b1227ae8d589d8fc7e85b90;hb=204a5e9e597063c8a01142f01d91f2138f93e5a5;hp=a2c35ed5514da47ac8428bae028bfaaa4838cb0f;hpb=9a46f67292972ad95b6e30ba3cac26ee73652e5b;p=scalable-opengroupware.org diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index a2c35ed5..f2568018 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -2,14 +2,21 @@ var accounts = {}; var mailboxTree; var mailAccounts; -if (typeof textMailAccounts != 'undefined') - mailAccounts = textMailAccounts.evalJSON(true); +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; @@ -18,6 +25,8 @@ var pageContent; var deleteMessageRequestCount = 0; +var messageCheckTimer; + /* mail list */ function openMessageWindow(msguid, url) { @@ -27,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; @@ -39,7 +44,7 @@ function openMessageWindow(msguid, url) { function onMessageDoubleClick(event) { var action; - if (currentMailboxType == "draft") + if (Mailer.currentMailboxType == "draft") action = "edit"; else action = "popupview"; @@ -55,8 +60,8 @@ 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=no,directories=0,status=0,menubar=0,copyhistory=0"); @@ -68,6 +73,7 @@ function openAddressbook(sender) { function onMenuSharing(event) { var folderID = document.menuTarget.getAttribute("dataname"); var type = document.menuTarget.getAttribute("datatype"); + if (type == "additional") window.alert(clabels["The user rights cannot be" + " edited for this object!"]); @@ -80,45 +86,36 @@ function onMenuSharing(event) { /* 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; } @@ -134,24 +131,24 @@ 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."]); } @@ -161,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 */ @@ -206,20 +214,24 @@ function ml_lowlight(sender) { /* bulk delete of messages */ function deleteSelectedMessages(sender) { - var messageList = $("messageList"); - var rowIds = messageList.getSelectedRowsId(); - - for (var i = 0; i < rowIds.length; i++) { - var url, http; - var rowId = rowIds[i].substr(4); - var messageId = currentMailbox + "/" + rowId; - url = ApplicationBaseURL + messageId + "/trash"; - deleteMessageRequestCount++; - var data = { "id": rowId, "mailbox": currentMailbox, "messageId": messageId }; - triggerAjaxRequest(url, deleteSelectedMessagesCallback, data); - } - - return false; + 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."]); + + return false; } function deleteSelectedMessagesCallback(http) { @@ -227,18 +239,28 @@ function deleteSelectedMessagesCallback(http) { if (isHttpStatus204(http.status)) { var data = http.callbackData; deleteCachedMessage(data["messageId"]); - if (currentMailbox == data["mailbox"]) { - + deleteMessageRequestCount--; + if (Mailer.currentMailbox == data["mailbox"]) { var div = $('messageContent'); - if (currentMessages[currentMailbox] == data["id"]) { + if (Mailer.currentMessages[Mailer.currentMailbox] == data["id"]) { div.update(); - currentMessages[currentMailbox] = null; + 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); - - deleteMessageRequestCount--; +// 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]); + } + } } } } @@ -246,6 +268,16 @@ function deleteSelectedMessagesCallback(http) { log ("deleteSelectedMessagesCallback: problem during ajax request " + http.status); } +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) { var failCount = 0; @@ -254,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(); @@ -264,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 */ @@ -285,8 +317,24 @@ function moveMessages(rowIds, folder) { } function onMenuDeleteMessage(event) { - deleteSelectedMessages(); - 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) { @@ -317,9 +365,9 @@ 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 table = $("messageList"); var head = table.tHead; @@ -337,19 +385,30 @@ function onMailboxTreeItemClick(event) { function _onMailboxMenuAction(menuEntry, error, actionName) { var targetMailbox = menuEntry.mailbox.fullName(); + var messages = new Array(); - if (targetMailbox == currentMailbox) + if (targetMailbox == Mailer.currentMailbox) window.alert(labels[error]); else { - var message; if (document.menuTarget.tagName == "DIV") - message = currentMessages[currentMailbox]; + // 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 - message = document.menuTarget.getAttribute("id").substr(4); - - var urlstr = (URLForFolderID(currentMailbox) + "/" + message - + "/" + actionName + "?folder=" + targetMailbox); - triggerAjaxRequest(urlstr, folderRefreshCallback, currentMailbox); + // 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:"")); + }); } } @@ -382,25 +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; + if (mailbox != Mailer.currentMailbox || reload) { + Mailer.currentMailbox = mailbox; var url = ApplicationBaseURL + encodeURI(mailbox) + "/view?noframe=1"; - var messageContent = $("messageContent"); - messageContent.update(); - lastClickedRow = null; // from generic.js - + + 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); } } @@ -414,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(); @@ -439,7 +504,7 @@ function openMailbox(mailbox, reload, idx) { } function openMailboxAtIndex(event) { - openMailbox(currentMailbox, true, this.getAttribute("idx")); + openMailbox(Mailer.currentMailbox, true, this.getAttribute("idx")); Event.stop(event); } @@ -450,15 +515,18 @@ function messageListCallback(http) { if (http.readyState == 4 && http.status == 200) { - document.messageListAjaxRequest = null; + 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 { @@ -475,7 +543,11 @@ function messageListCallback(http) { var row = $("row_" + selected); if (row) { row.select(); - div.scrollTop = row.rowIndex * row.getHeight(); // scroll to selected message + 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(); @@ -513,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); @@ -534,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) { @@ -609,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 @@ -624,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++; @@ -640,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++; } @@ -656,7 +732,7 @@ function storeCachedMessage(cachedMessage) { oldest = 0; } - cachedMessages[oldest] = cachedMessage; + Mailer.cachedMessages[oldest] = cachedMessage; } function onMessageSelectionChange() { @@ -664,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); } } @@ -680,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(); } } @@ -699,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); } @@ -728,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'); @@ -743,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) @@ -809,9 +958,6 @@ function moveTo(uri) { alert("MoveTo: " + uri); } -function deleteSelectedMails() { -} - /* message menu entries */ function onMenuOpenMessage(event) { return openMessageWindowsForSelection('popupview'); @@ -834,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); } @@ -842,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; @@ -859,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); } @@ -880,6 +1040,9 @@ function expandUpperTree(node) { } function onHeaderClick(event) { + if (TableKit.Resizable._onHandle) + return; + var headerId = this.getAttribute("id"); var newSortAttribute; if (headerId == "subjectHeader") @@ -903,11 +1066,11 @@ function onHeaderClick(event) { } function refreshCurrentFolder() { - openMailbox(currentMailbox, true); + openMailbox(Mailer.currentMailbox, true); } function refreshFolderByType(type) { - if (currentMailboxType == type) + if (Mailer.currentMailboxType == type) refreshCurrentFolder(); } @@ -928,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); @@ -1027,7 +1190,7 @@ function configureMessageListBodyEvents(table) { 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)); } } } @@ -1092,10 +1255,35 @@ function openInbox(node) { } function initMailer(event) { - if (!document.body.hasClassName("popup")) { + 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() { @@ -1123,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]); } } @@ -1141,6 +1329,7 @@ function updateMailboxTreeInPage() { onFolderMenuClick.bindAsEventListener(nodes[i])); if (!inboxFound && nodes[i].parentNode.getAttribute("datatype") == "inbox") { + Mailer.currentMailboxType = "inbox"; openInbox(nodes[i]); inboxFound = true; } @@ -1229,7 +1418,7 @@ function updateMailboxMenus() { menu.appendChild(menuEntry); var mailbox = accounts[mailAccounts[i]]; var newSubmenuId = generateMenuForMailbox(mailbox, - key, mailboxActions[key]); + key, mailboxActions[key]); submenuIds.push(newSubmenuId); } initMenu(menuDIV, submenuIds); @@ -1240,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(); + } } } @@ -1257,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"); @@ -1297,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) { @@ -1329,7 +1560,6 @@ function onMenuDeleteFolder(event) { function onMenuExpungeFolder(event) { var folderID = document.menuTarget.getAttribute("dataname"); var urlstr = URLForFolderID(folderID) + "/expunge"; - triggerAjaxRequest(urlstr, folderRefreshCallback, folderID); } @@ -1338,13 +1568,13 @@ function onMenuEmptyTrash(event) { var urlstr = URLForFolderID(folderID) + "/emptyTrash"; 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); } @@ -1355,13 +1585,8 @@ function _onMenuChangeToXXXFolder(event, folder) { window.alert(labels["You need to choose a non-virtual folder!"]); else { var folderID = document.menuTarget.getAttribute("dataname"); - var number = folderID.split("/").length; - if (number > 3) - window.alert(labels["You need to choose a root subfolder!"]); - else { - var urlstr = URLForFolderID(folderID) + "/setAs" + folder + "Folder"; - triggerAjaxRequest(urlstr, folderOperationCallback); - } + var urlstr = URLForFolderID(folderID) + "/setAs" + folder + "Folder"; + triggerAjaxRequest(urlstr, folderOperationCallback); } } @@ -1378,27 +1603,59 @@ function onMenuChangeToTrashFolder(event) { } function onMenuLabelNone() { - var rowId = document.menuTarget.getAttribute("id").substr(4); - var messageId = currentMailbox + "/" + rowId; - var urlstr = ApplicationBaseURL + messageId + "/removeAllLabels"; - triggerAjaxRequest(urlstr, messageFlagCallback, - { mailbox: currentMailbox, msg: rowId, label: null } ); + 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 flags = document.menuTarget.getAttribute("labels").split(" "); - - var rowId = document.menuTarget.getAttribute("id").substr(4); - var messageId = currentMailbox + "/" + rowId; + 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"; - var operation = "add"; - if (flags.indexOf("label" + flag) > -1) - operation = "remove"; - var urlstr = (ApplicationBaseURL + messageId - + "/" + operation + "Label" + flag); - triggerAjaxRequest(urlstr, messageFlagCallback, - { mailbox: currentMailbox, msg: rowId, - label: operation + flag } ); + triggerAjaxRequest(url + id + "/" + operation + "Label" + flag, + messageFlagCallback, + { mailbox: Mailer.currentMailbox, msg: id, + label: operation + flag } ); + }); } function onMenuLabelFlag1() { @@ -1433,7 +1690,7 @@ function folderRefreshCallback(http) { if (http.readyState == 4 && isHttpStatus204(http.status)) { var oldMailbox = http.callbackData; - if (oldMailbox == currentMailbox) + if (oldMailbox == Mailer.currentMailbox) refreshCurrentFolder(); } else @@ -1444,7 +1701,7 @@ function messageFlagCallback(http) { if (http.readyState == 4 && isHttpStatus204(http.status)) { var data = http.callbackData; - if (data["mailbox"] == currentMailbox) { + if (data["mailbox"] == Mailer.currentMailbox) { var row = $("row_" + data["msg"]); var operation = data["label"]; if (operation) { @@ -1471,16 +1728,15 @@ function messageFlagCallback(http) { function onLabelMenuPrepareVisibility() { var messageList = $("messageList"); - var rows = messageList.getSelectedRows(); - var flags = {}; - for (var i = 1; i < 6; i++) - flags["label" + i] = true; - for (var i = 0; i < rows.length; i++) { - var rowFlags = rows[i].getAttribute("labels").split(" "); - for (var flag in flags) - if (flags[flag] && rowFlags.indexOf(flag) == -1) - flags[flag] = false; + + 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") @@ -1529,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, @@ -1558,7 +1821,7 @@ function getMenus() { return menus; } -addEvent(window, 'load', initMailer); +FastInit.addOnLoad(initMailer); function Mailbox(type, name) { this.type = type;