X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=UI%2FWebServerResources%2FMailerUI.js;h=074a94f944c3167deca28fc5eff81d87ca9d44cf;hb=18e465b1915fec3f2b958e1db0ddab00d883ceab;hp=b526b960eb2c9272f1c3b63a0af05563f60d4148;hpb=676baa9a4356a8dd9d99d1c88fc7589d742149b9;p=scalable-opengroupware.org diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index b526b960..074a94f9 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -1,42 +1,16 @@ -/* - Copyright (C) 2005 SKYRIX Software AG - - This file is part of OpenGroupware.org. - - OGo is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - OGo is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with OGo; see the file COPYING. If not, write to the - Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. -*/ -/* JavaScript for SOGo Mailer */ - -/* - DOM ids available in mail list view: - row_$msgid - div_$msgid - readdiv_$msgid - unreaddiv_$msgid - - Window Properties: - width, height - bool: resizable, scrollbars, toolbar, location, directories, status, - menubar, copyhistory -*/ +/* JavaScript for SOGoMail */ +var accounts = {}; +var mailboxTree; var currentMessages = new Array(); var maxCachedMessages = 20; var cachedMessages = new Array(); -var currentMailbox = ''; +var currentMailbox = null; +var currentMailboxType = ""; + +var usersRightsWindowHeight = 320; +var usersRightsWindowWidth = 400; + /* mail list */ function openMessageWindow(msguid, url) { @@ -45,9 +19,7 @@ function openMessageWindow(msguid, url) { wId += "SOGo_msg_" + msguid; markMailReadInWindow(window, msguid); } - var msgWin = window.open(url, wId, - "width=680,height=520,resizable=1,scrollbars=1,toolbar=0," - + "location=0,directories=0,status=0,menubar=0,copyhistory=0"); + var msgWin = openMailComposeWindow(url, wId); if (msguid) { msgWin.messageId = msguid; msgWin.messageURL = ApplicationBaseURL + currentMailbox + "/" + msguid; @@ -58,12 +30,14 @@ function openMessageWindow(msguid, url) { } function onMessageDoubleClick(event) { - resetSelection(window); - var msguid = this.parentNode.id.substr(4); - - return openMessageWindow(msguid, - ApplicationBaseURL + currentMailbox + "/" - + msguid + "/popupview"); + var action; + + if (currentMailboxType == "draft") + action = "edit"; + else + action = "popupview"; + + return openMessageWindowsForSelection(action, true); } function toggleMailSelect(sender) { @@ -72,80 +46,26 @@ function toggleMailSelect(sender) { row.className = sender.checked ? "tableview_selected" : "tableview"; } -function clearSearch(sender) { - var searchField = window.$("search"); - if (searchField) searchField.value=""; - return true; -} - -/* mail editor */ - -function validateEditorInput(sender) { - var errortext = ""; - var field; - - field = document.pageform.subject; - if (field.value == "") - errortext = errortext + labels.error_missingsubject + "\n"; - - if (!UIxRecipientSelectorHasRecipients()) - errortext = errortext + labels.error_missingrecipients + "\n"; - - if (errortext.length > 0) { - alert(labels.error_validationfailed.decodeEntities() + ":\n" - + errortext.decodeEntities()); - return false; - } - return true; -} - -function clickedEditorSend(sender) { - if (!validateEditorInput(sender)) - return false; - - document.pageform.action="send"; - document.pageform.submit(); - // if everything is ok, close the window - return true; -} - -function clickedEditorAttach(sender) { - var urlstr; - - urlstr = "viewAttachments"; - window.open(urlstr, "SOGo_attach", - "width=320,height=320,resizable=1,scrollbars=1,toolbar=0," + - "location=0,directories=0,status=0,menubar=0,copyhistory=0"); - return false; /* stop following the link */ -} - -function clickedEditorSave(sender) { - document.pageform.action="save"; - document.pageform.submit(); - refreshOpener(); - return true; -} - -function clickedEditorDelete(sender) { - document.pageform.action="delete"; - document.pageform.submit(); - refreshOpener(); - window.close(); - return true; -} - function openAddressbook(sender) { var urlstr; - + 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"); + "width=640,height=400,resizable=1,scrollbars=1,toolbar=0," + + "location=0,directories=0,status=0,menubar=0,copyhistory=0"); w.focus(); return false; } +function onMenuSharing(event) { + var folderID = document.menuTarget.getAttribute("dataname"); + var urlstr = URLForFolderID(folderID) + "/acls"; + preventDefault(event); + + openAclWindow(urlstr); +} + /* mail list DOM changes */ function markMailInWindow(win, msguid, markread) { @@ -158,36 +78,36 @@ function markMailInWindow(win, msguid, markread) { 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); - } + { + 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); + } } 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); - } + { + 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); + } } return true; } @@ -200,41 +120,28 @@ function markMailReadInWindow(win, msguid) { return markMailInWindow(win, msguid, true); } -/* main window */ - -function reopenToRemoveLocationBar() { - // we cannot really use this, see below at the close comment - if (window.locationbar && window.locationbar.visible) { - newwin = window.open(window.location.href, "SOGo", - "width=800,height=600,resizable=1,scrollbars=1," + - "toolbar=0,location=0,directories=0,status=0," + - "menubar=0,copyhistory=0"); - if (newwin) { - window.close(); // this does only work for windows opened by scripts! - newwin.focus(); - return true; - } - return false; - } - return true; -} - /* mail list reply */ -function openMessageWindowsForSelection(action) -{ +function openMessageWindowsForSelection(action, firstOnly) { if (document.body.hasClassName("popup")) win = openMessageWindow(window.messageId, - window.messageURL + "/" + action /* url */); + window.messageURL + "/" + action); else { - var messageList = $("messageList"); - var rows = messageList.getSelectedRowsId(); - var idset = ""; - for (var i = 0; i < rows.length; i++) - win = openMessageWindow(rows[i].substr(4) /* msguid */, + var messageList = $("messageList"); + var rows = messageList.getSelectedRowsId(); + if (rows.length > 0) { + if (firstOnly) + openMessageWindow(rows[0].substr(4), + ApplicationBaseURL + currentMailbox + + "/" + rows[0].substr(4) + + "/" + action); + else + for (var i = 0; i < rows.length; i++) + openMessageWindow(rows[i].substr(4), ApplicationBaseURL + currentMailbox - + "/" + rows[i].substr(4) - + "/" + action /* url */); + + "/" + rows[i].substr(4) + + "/" + action); + } } return false; @@ -242,11 +149,11 @@ function openMessageWindowsForSelection(action) function mailListMarkMessage(event) { var http = createHTTPClient(); - var url = ApplicationBaseURL + currentMailbox + "/" + action + "?uid=" + msguid; + var url = ApplicationBaseURL + currentMailbox + "/" + msguid + "/" + action; if (http) { // TODO: add parameter to signal that we are only interested in OK - http.open("POST", url + "&jsonly=1", false /* not async */); + http.open("POST", url, false /* not async */); http.send(""); if (http.status != 200) { // TODO: refresh page? @@ -266,16 +173,14 @@ function mailListMarkMessage(event) { var oldMaillistHighlight = null; // to remember deleted/selected style -function ml_highlight(sender) -{ +function ml_highlight(sender) { oldMaillistHighlight = sender.className; if (oldMaillistHighlight == "tableview_highlight") oldMaillistHighlight = null; sender.className = "tableview_highlight"; } -function ml_lowlight(sender) -{ +function ml_lowlight(sender) { if (oldMaillistHighlight) { sender.className = oldMaillistHighlight; oldMaillistHighlight = null; @@ -289,22 +194,22 @@ function ml_lowlight(sender) 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?").decodeEntities()) + if (!confirm("Delete current folder?")) return false; - + // TODO: should use a form-POST or AJAX window.location.href = "deleteFolder"; return false; @@ -314,7 +219,7 @@ function ctxFolderDelete(sender) { function uixDeleteSelectedMessages(sender) { var failCount = 0; - + var messageList = $("messageList"); var rowIds = messageList.getSelectedRowsId(); @@ -324,20 +229,20 @@ function uixDeleteSelectedMessages(sender) { /* send AJAX request (synchronously) */ var messageId = currentMailbox + "/" + rowId; - url = ApplicationBaseURL + messageId + "/trash?jsonly=1"; + url = ApplicationBaseURL + messageId + "/trash"; http = createHTTPClient(); - http.open("GET", url, false /* not async */); + http.open("POST", url, false /* not async */); http.send(""); - if (http.status != 200) { /* request failed */ + if (!isHttpStatus204(http.status)) { /* request failed */ failCount++; http = null; continue; } else { deleteCachedMessage(messageId); if (currentMessages[currentMailbox] == rowId) { - var div = $('messageContent'); - div.innerHTML = ""; - currentMessages[currentMailbox] = null; + var div = $('messageContent'); + div.update(); + currentMessages[currentMailbox] = null; } } http = null; @@ -351,7 +256,7 @@ function uixDeleteSelectedMessages(sender) { if (failCount > 0) alert("Could not delete " + failCount + " messages!"); - + return false; } @@ -362,9 +267,10 @@ function moveMessages(rowIds, folder) { var url, http; /* send AJAX request (synchronously) */ - + var messageId = currentMailbox + "/" + rowIds[i]; - url = ApplicationBaseURL + messageId + "/move?jsonly=1&tofolder=" + folder; + url = (ApplicationBaseURL + messageId + + "/move?tofolder=" + folder); http = createHTTPClient(); http.open("GET", url, false /* not async */); http.send(""); @@ -373,9 +279,9 @@ function moveMessages(rowIds, folder) { row.parentNode.removeChild(row); deleteCachedMessage(messageId); if (currentMessages[currentMailbox] == rowIds[i]) { - var div = $('messageContent'); - div.innerHTML = ""; - currentMessages[currentMailbox] = null; + var div = $('messageContent'); + div.update(); + currentMessages[currentMailbox] = null; } } else /* request failed */ @@ -388,121 +294,215 @@ function moveMessages(rowIds, folder) { if (failCount > 0) alert("Could not move " + failCount + " messages!"); - + return failCount; } function onMenuDeleteMessage(event) { uixDeleteSelectedMessages(); - event.preventDefault(); + preventDefault(event); +} + +function onPrintCurrentMessage(event) { + var rowIds = $("messageList").getSelectedRowsId(); + if (rowIds.length == 0) { + window.alert(labels["Please select a message to print."]); + } + else if (rowIds.length > 1) { + window.alert(labels["Please select only one message to print."]); + } + else + window.print(); + + preventDefault(event); } function onMailboxTreeItemClick(event) { - var topNode = $("d"); + var topNode = $("mailboxTree"); var mailbox = this.parentNode.getAttribute("dataname"); - if (topNode.selectedEntry) { - log ("deselecting"); + if (topNode.selectedEntry) topNode.selectedEntry.deselect(); - } this.select(); topNode.selectedEntry = this; - openMailbox(mailbox); - event.preventDefault(); + search = {}; + sorting = {}; + $("searchValue").value = ""; + initCriteria(); + + currentMailboxType = this.parentNode.getAttribute("datatype"); + if (currentMailboxType == "account" || currentMailboxType == "additional") { + currentMailbox = mailbox; + $("messageContent").update(); + var body = $("messageList").tBodies[0]; + for (var i = body.rows.length; i > 0; i--) + body.deleteRow(i-1); + } + else + openMailbox(mailbox); + + preventDefault(event); +} + +function onMailboxMenuMove() { + window.alert("unimplemented"); +} + +function onMailboxMenuCopy() { + window.alert("unimplemented"); } function refreshMailbox() { - openMailbox(currentMailbox, true); + var topWindow = getTopWindow(); + if (topWindow) + topWindow.refreshCurrentFolder(); + + return false; +} + +function onComposeMessage() { + var topWindow = getTopWindow(); + if (topWindow) + topWindow.composeNewMessage(); return false; } -function openMailbox(mailbox, reload) -{ +function composeNewMessage() { + var account = 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&desc=1"; - var mailboxContent = $("mailboxContent"); - var rightDragHandle = $("rightDragHandle"); + var url = ApplicationBaseURL + mailbox + "/view?noframe=1"; var messageContent = $("messageContent"); - messageContent.innerHTML = ''; - if (mailbox.lastIndexOf("/") == 0) { - var url = (ApplicationBaseURL + currentMailbox + "/" - + "/view?noframe=1"); - if (document.messageAjaxRequest) { - document.messageAjaxRequest.aborted = true; - document.messageAjaxRequest.abort(); - } - document.messageAjaxRequest - = triggerAjaxRequest(url, messageCallback); - mailboxContent.innerHTML = ''; - mailboxContent.style.visibility = "hidden;"; - rightDragHandle.style.visibility = "hidden;"; - messageContent.style.top = "0px;"; - } else { - if (document.messageListAjaxRequest) { - document.messageListAjaxRequest.aborted = true; - document.messageListAjaxRequest.abort(); - } - if (currentMessages[mailbox]) { - loadMessage(currentMessages[mailbox]); - url += '&pageforuid=' + currentMessages[mailbox]; - } - document.messageListAjaxRequest - = triggerAjaxRequest(url, messageListCallback, - currentMessages[mailbox]); - if (mailboxContent.style.visibility == "hidden") { - mailboxContent.style.visibility = "visible;"; - rightDragHandle.style.visibility = "visible;"; - messageContent.style.top = (rightDragHandle.offsetTop - + rightDragHandle.offsetHeight - + 'px;'); + messageContent.update(); + + var currentMessage; + if (!idx) { + currentMessage = currentMessages[mailbox]; + if (currentMessage) { + loadMessage(currentMessage); + url += '&pageforuid=' + currentMessage; } } - } -// triggerAjaxRequest(mailbox, 'toolbar', toolbarCallback); -} -function openMailboxAtIndex(element) { - var idx = element.getAttribute("idx"); - var url = ApplicationBaseURL + currentMailbox + "/view?noframe=1&idx=" + idx; + var searchValue = search["value"]; + if (searchValue && searchValue.length > 0) + url += ("&search=" + search["criteria"] + + "&value=" + escape(searchValue)); + var sortAttribute = sorting["attribute"]; + if (sortAttribute && sortAttribute.length > 0) + url += ("&sort=" + sorting["attribute"] + + "&asc=" + sorting["ascending"]); + if (idx) + url += "&idx=" + idx; + if (document.messageListAjaxRequest) { + document.messageListAjaxRequest.aborted = true; + document.messageListAjaxRequest.abort(); + } + + var mailboxContent = $("mailboxContent"); + if (mailboxContent.getStyle('visibility') == "hidden") { + mailboxContent.setStyle({ visibility: "visible" }); + var rightDragHandle = $("rightDragHandle"); + rightDragHandle.setStyle({ visibility: "visible" }); + messageContent.setStyle({ top: (rightDragHandle.offsetTop + + rightDragHandle.offsetHeight + + 'px') }); + } + + document.messageListAjaxRequest + = triggerAjaxRequest(url, messageListCallback, + currentMessage); - if (document.messageListAjaxRequest) { - document.messageListAjaxRequest.aborted = true; - document.messageListAjaxRequest.abort(); + var quotasUrl = ApplicationBaseURL + mailbox + "/quotas"; + document.quotasAjaxRequest + = triggerAjaxRequest(quotasUrl, quotasCallback); } - document.messageListAjaxRequest - = triggerAjaxRequest(url, messageListCallback); +} - return false; +function openMailboxAtIndex(event) { + openMailbox(currentMailbox, true, this.getAttribute("idx")); + + preventDefault(event); } -function messageListCallback(http) -{ +function messageListCallback(http) { var div = $('mailboxContent'); - + if (http.readyState == 4 && http.status == 200) { - document.messageListAjaxRequest = null; - div.innerHTML = http.responseText; + document.messageListAjaxRequest = null; + div.update(http.responseText); + + TableKit.Resizable.init($('messageList')); + var selected = http.callbackData; if (selected) { - var row = $('row_' + selected); - row.select(); + var row = $("row_" + selected); + if (row) + row.select(); } configureMessageListEvents(); - configureSortableTableHeaders(); + + 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; + + if (sortHeader) { + var sortImage = createElement("img", "messageSortImage", "sortImage"); + sortHeader.insertBefore(sortImage, sortHeader.firstChild); + if (sorting["ascending"]) + sortImage.src = ResourcesURL + "/title_sortdown_12x12.png"; + else + sortImage.src = ResourcesURL + "/title_sortup_12x12.png"; + } + } } else - log ("ajax fuckage"); + log("messageListCallback: problem during ajax request (readyState = " + http.readyState + ", status = " + http.status + ")"); +} + +function quotasCallback(http) { + if (http.readyState == 4 + && http.status == 200) { + var hasQuotas = false; + + 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 used = mbQuotas["usedSpace"]; + var max = mbQuotas["maxQuota"]; + var percents = (Math.round(used * 10000 / max) / 100); + var format = labels["quotasFormat"]; + var text = format.formatted(used, max, percents); + window.status = text; + } + } } -function onMessageContextMenu(event) -{ +function onMessageContextMenu(event) { var menu = $('messageListMenu'); - menu.addEventListener("hideMenu", onMessageContextMenuHide, false); - onMenuClick(event, 'messageListMenu'); + Event.observe(menu, "hideMenu", onMessageContextMenuHide); + popupMenu(event, "messageListMenu", this); var topNode = $('messageList'); var selectedNodes = topNode.getSelectedRows(); @@ -513,8 +513,7 @@ function onMessageContextMenu(event) this.select(); } -function onMessageContextMenuHide(event) -{ +function onMessageContextMenuHide(event) { var topNode = $('messageList'); if (topNode.menuSelectedEntry) { @@ -529,13 +528,10 @@ function onMessageContextMenuHide(event) } } -function onFolderMenuClick(event) -{ +function onFolderMenuClick(event) { var onhide, menuName; - + var menutype = this.parentNode.getAttribute("datatype"); -// log("parentNode: " + this.parentNode.tagName); -// log("menutype: " + menutype); if (menutype) { if (menutype == "inbox") { menuName = "inboxIconMenu"; @@ -551,21 +547,22 @@ function onFolderMenuClick(event) } var menu = $(menuName); - menu.addEventListener("hideMenu", onFolderMenuHide, false); - onMenuClick(event, menuName); + Event.observe(menu, "hideMenu", onFolderMenuHide); + popupMenu(event, menuName, this.parentNode); - var topNode = $('d'); + var topNode = $("mailboxTree"); if (topNode.selectedEntry) topNode.selectedEntry.deselect(); if (topNode.menuSelectedEntry) topNode.menuSelectedEntry.deselect(); topNode.menuSelectedEntry = this; this.select(); + + preventDefault(event); } -function onFolderMenuHide(event) -{ - var topNode = $('d'); +function onFolderMenuHide(event) { + var topNode = $("mailboxTree"); if (topNode.menuSelectedEntry) { topNode.menuSelectedEntry.deselect(); @@ -580,9 +577,9 @@ function deleteCachedMessage(messageId) { var counter = 0; while (counter < cachedMessages.length - && !done) + && !done) if (cachedMessages[counter] - && cachedMessages[counter]['idx'] == messageId) { + && cachedMessages[counter]['idx'] == messageId) { cachedMessages.splice(counter, 1); done = true; } @@ -590,15 +587,14 @@ function deleteCachedMessage(messageId) { counter++; } -function getCachedMessage(idx) -{ +function getCachedMessage(idx) { var message = null; var counter = 0; while (counter < cachedMessages.length - && message == null) + && message == null) if (cachedMessages[counter] - && cachedMessages[counter]['idx'] == currentMailbox + '/' + idx) + && cachedMessages[counter]['idx'] == currentMailbox + '/' + idx) message = cachedMessages[counter]; else counter++; @@ -606,8 +602,7 @@ function getCachedMessage(idx) return message; } -function storeCachedMessage(cachedMessage) -{ +function storeCachedMessage(cachedMessage) { var oldest = -1; var timeOldest = -1; var counter = 0; @@ -617,9 +612,9 @@ function storeCachedMessage(cachedMessage) else { while (cachedMessages[counter]) { if (oldest == -1 - || cachedMessages[counter]['time'] < timeOldest) { - oldest = counter; - timeOldest = cachedMessages[counter]['time']; + || cachedMessages[counter]['time'] < timeOldest) { + oldest = counter; + timeOldest = cachedMessages[counter]['time']; } counter++; } @@ -631,9 +626,9 @@ function storeCachedMessage(cachedMessage) cachedMessages[oldest] = cachedMessage; } -function onMessageSelectionChange() -{ +function onMessageSelectionChange() { var rows = this.getSelectedRowsId(); + if (rows.length == 1) { var idx = rows[0].substr(4); @@ -644,53 +639,92 @@ function onMessageSelectionChange() } } -function loadMessage(idx) -{ - var cachedMessage = getCachedMessage(idx); - +function loadMessage(idx) { if (document.messageAjaxRequest) { document.messageAjaxRequest.aborted = true; document.messageAjaxRequest.abort(); } + var cachedMessage = getCachedMessage(idx); + if (cachedMessage == null) { var url = (ApplicationBaseURL + currentMailbox + "/" - + idx + "/view?noframe=1"); + + idx + "/view?noframe=1"); document.messageAjaxRequest = triggerAjaxRequest(url, messageCallback, idx); markMailInWindow(window, idx, true); } else { var div = $('messageContent'); - div.innerHTML = cachedMessage['text']; + div.update(cachedMessage['text']); cachedMessage['time'] = (new Date()).getTime(); document.messageAjaxRequest = null; + configureLinksInMessage(); } } -function messageCallback(http) -{ +function configureLinksInMessage() { + var messageDiv = $('messageContent'); + var mailContentDiv = document.getElementsByClassName('mailer_mailcontent', + messageDiv)[0]; + Event.observe(mailContentDiv, "contextmenu", + onMessageContentMenu.bindAsEventListener(mailContentDiv)); + 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])); + } + else + Event.observe(anchors[i], "click", + onMessageAnchorClick); + + var editDraftButton = $("editDraftButton"); + if (editDraftButton) + Event.observe(editDraftButton, "click", onMessageEditDraft); +} + +function onMessageContentMenu(event) { + popupMenu(event, 'messageContentMenu', this); +} + +function onMessageEditDraft(event) { + return openMessageWindowsForSelection("edit", true); +} + +function onEmailAddressClick(event) { + popupMenu(event, 'addressMenu', this); +} + +function onMessageAnchorClick (event) { + window.open(this.href); + preventDefault(event); +} + +function messageCallback(http) { var div = $('messageContent'); if (http.readyState == 4 && http.status == 200) { document.messageAjaxRequest = null; - div.innerHTML = http.responseText; - + div.update(http.responseText); + configureLinksInMessage(); + if (http.callbackData) { var cachedMessage = new Array(); cachedMessage['idx'] = currentMailbox + '/' + http.callbackData; cachedMessage['time'] = (new Date()).getTime(); cachedMessage['text'] = http.responseText; if (cachedMessage['text'].length < 30000) - storeCachedMessage(cachedMessage); + storeCachedMessage(cachedMessage); } } else - log ("ajax fuckage"); + log("messageCallback: problem during ajax request: " + http.status); } -function processMailboxMenuAction(mailbox) -{ +function processMailboxMenuAction(mailbox) { var currentNode, upperNode; var mailboxName; var action; @@ -700,16 +734,16 @@ function processMailboxMenuAction(mailbox) upperNode = null; while (currentNode - && !currentNode.hasAttribute('mailboxaction')) + && !currentNode.hasAttribute('mailboxaction')) currentNode = currentNode.parentNode.parentNode.parentMenuItem; if (currentNode) { action = currentNode.getAttribute('mailboxaction'); -// var rows = collectSelectedRows(); -// var rString = rows.join(', '); -// alert("performing '" + action + "' on " + rString -// + " to " + mailboxName); + // var rows = collectSelectedRows(); + // var rString = rows.join(', '); + // alert("performing '" + action + "' on " + rString + // + " to " + mailboxName); } } @@ -742,117 +776,102 @@ function moveTo(uri) { alert("MoveTo: " + uri); } -function deleteSelectedMails() -{ +function deleteSelectedMails() { } /* message menu entries */ -function onMenuOpenMessage(event) -{ - var node = getParentMenu(event.target).menuTarget.parentNode; - var msgId = node.getAttribute('id').substr(4); +function onMenuOpenMessage(event) { + return openMessageWindowsForSelection('popupview'); +} - return openMessageWindow(msgId, - ApplicationBaseURL + currentMailbox - + "/" + msgId + "/view"); +function onMenuReplyToSender(event) { + return openMessageWindowsForSelection('reply'); } -/* contacts */ -function newContactFromEmail(sender) { - var mailto = sender.parentNode.parentNode.menuTarget.innerHTML; - - var emailre - = /([a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z])/g; - emailre.exec(mailto); - email = RegExp.$1; - - var namere = /(\w[\w\ _-]+)\ (<|<)/; - var c_name = ''; - if (namere.test(mailto)) { - namere.exec(mailto); - c_name += RegExp.$1; +function onMenuReplyToAll(event) { + return openMessageWindowsForSelection('replyall'); +} + +function onMenuForwardMessage(event) { + return openMessageWindowsForSelection('forward'); +} + +function onMenuViewMessageSource(event) { + var messageList = $("messageList"); + var rows = messageList.getSelectedRowsId(); + + if (rows.length > 0) { + var url = (ApplicationBaseURL + currentMailbox + "/" + + rows[0].substr(4) + "/viewsource"); + openMailComposeWindow(url); } + preventDefault(event); +} + +/* contacts */ +function newContactFromEmail(event) { + var mailto = document.menuTarget.innerHTML; + + var email = extractEmailAddress(mailto); + var c_name = extractEmailName(mailto); if (email.length > 0) { - emailre.exec(""); var url = UserFolderURL + "Contacts/new?contactEmail=" + email; if (c_name) - url += "&contactFN=" + c_name; - w = window.open(url, null, - "width=546,height=490,resizable=1,scrollbars=1,toolbar=0," - + "location=0,directories=0,status=0,menubar=0,copyhistory=0"); - w.focus(); + url += "&contactFN=" + c_name; + openContactWindow(url); } return false; /* stop following the link */ } function newEmailTo(sender) { - return openMailTo(sender.parentNode.parentNode.menuTarget.innerHTML); + return openMailTo(document.menuTarget.innerHTML); } -function expandUpperTree(node) -{ +function expandUpperTree(node) { var currentNode = node.parentNode; - while (currentNode.className != "dtree") - { - if (currentNode.className == 'clip') - { - var id = currentNode.getAttribute("id"); - var number = parseInt(id.substr(2)); - if (number > 0) - { - var cn = d.aNodes[number]; - d.nodeStatus(1, number, cn._ls); - } - } - currentNode = currentNode.parentNode; + while (currentNode.className != "dtree") { + if (currentNode.className == 'clip') { + var id = currentNode.getAttribute("id"); + var number = parseInt(id.substr(2)); + if (number > 0) { + var cn = mailboxTree.aNodes[number]; + mailboxTree.nodeStatus(1, number, cn._ls); + } } -} - -function initMailboxSelection(mailboxName) -{ - currentMailbox = mailboxName; - log("initMailboxSelection: " + mailboxName); - var tree = $("d"); - var treeNodes = document.getElementsByClassName("dTreeNode", tree); - var i = 0; - while (i < treeNodes.length - && treeNodes[i].getAttribute("dataname") != currentMailbox) - i++; - if (i < treeNodes.length) { - log ("found mailbox"); - var links = document.getElementsByClassName("node", treeNodes[i]); - if (tree.selectedEntry) - tree.selectedEntry.deselect(); - links[0].select(); - tree.selectedEntry = links[0]; - expandUpperTree(links[0]); + currentNode = currentNode.parentNode; } } -function onHeaderClick(event) -{ - if (document.messageListAjaxRequest) { - document.messageListAjaxRequest.aborted = true; - document.messageListAjaxRequest.abort(); +function onHeaderClick(event) { + var headerId = this.getAttribute("id"); + var newSortAttribute; + if (headerId == "subjectHeader") + newSortAttribute = "subject"; + else if (headerId == "fromHeader") + newSortAttribute = "from"; + else if (headerId == "dateHeader") + newSortAttribute = "date"; + else + newSortAttribute = "arrival"; + + if (sorting["attribute"] == newSortAttribute) + sorting["ascending"] = !sorting["ascending"]; + else { + sorting["attribute"] = newSortAttribute; + sorting["ascending"] = true; } - url = ApplicationBaseURL + currentMailbox + "/" + this.link; - if (!this.link.match(/noframe=/)) - url += "&noframe=1"; - document.messageListAjaxRequest - = triggerAjaxRequest(url, messageListCallback); - event.preventDefault(); -} + refreshCurrentFolder(); -function onSearchFormSubmit() -{ - log ("search not implemented"); + Event.stop(event); +} - return false; +function refreshCurrentFolder() { + openMailbox(currentMailbox, true); } function pouetpouet(event) { @@ -881,47 +900,47 @@ var mailboxSpanDrop = function(data) { } else success = false; - + return success; } - + var plusSignEnter = function() { var nodeNr = parseInt(this.id.substr(2)); - if (!d.aNodes[nodeNr]._io) + if (!mailboxTree.aNodes[nodeNr]._io) this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000); } - + var plusSignExit = function() { if (this.plusSignTimer) { clearTimeout(this.plusSignTimer); this.plusSignTimer = null; } } - + function openPlusSign(nodeNr) { - d.nodeStatus(1, nodeNr, d.aNodes[nodeNr]._ls); - d.aNodes[nodeNr]._io = 1; + mailboxTree.nodeStatus(1, nodeNr, mailboxTree.aNodes[nodeNr]._ls); + mailboxTree.aNodes[nodeNr]._io = 1; this.plusSignTimer = null; } var messageListGhost = function () { var newDiv = document.createElement("div"); -// newDiv.style.width = "25px;"; -// newDiv.style.height = "25px;"; + // newDiv.style.width = "25px;"; + // newDiv.style.height = "25px;"; newDiv.style.backgroundColor = "#aae;"; newDiv.style.border = "2px solid #a3a;"; newDiv.style.padding = "5px;"; newDiv.ghostOffsetX = 10; newDiv.ghostOffsetY = 5; - var imgCode = ''; + var newImg = document.createElement("img"); + newImg.src = ResourcesURL + "/message-mail.png"; - var current = this; - while (!current.getSelectedRows) - current = current.parentNode; - var count = current.getSelectedRows().length; - var text = imgCode + '
' + count + ' messages...'; - newDiv.innerHTML = text; + var list = $("messageList"); + var count = list.getSelectedRows().length; + newDiv.appendChild(newImg); + newDiv.appendChild(document.createElement("br")); + newDiv.appendChild(document.createTextNode(count + " messages...")); return newDiv; } @@ -935,36 +954,51 @@ var messageListData = function(type) { return msgIds; } +/* 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() { var messageList = $("messageList"); if (messageList) { - messageList.addEventListener("selectionchange", - onMessageSelectionChange, false); - var rows = messageList.tBodies[0].rows; - var start = 0; - if (rows.length > 1) { - while (rows[start].cells[0].hasClassName("tbtv_headercell") - || rows[start].cells[0].hasClassName("tbtv_navcell")) - start++; - for (var i = start; i < rows.length; i++) { - rows[i].addEventListener("mousedown", onRowClick, false); - rows[i].addEventListener("contextmenu", onMessageContextMenu, false); - - rows[i].dndTypes = function() { return new Array("mailRow"); }; - rows[i].dndGhost = messageListGhost; - rows[i].dndDataForType = messageListData; - document.DNDManager.registerSource(rows[i]); - - for (var j = 0; j < rows[i].cells.length; j++) { - var cell = rows[i].cells[j]; - cell.addEventListener("mousedown", listRowMouseDownHandler, false); - if (j == 2 || j == 3 || j == 5) - cell.addEventListener("dblclick", onMessageDoubleClick, false); - else if (j == 4) { - var img = cell.childNodesWithTag("img")[0]; - img.addEventListener("click", mailListMarkMessage, false); - } - } + Event.observe(messageList, "mousedown", + onMessageSelectionChange.bindAsEventListener(messageList)); + + configureMessageListHeaders(messageList.tHead.rows[0].cells); + + var cell = messageList.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; + for (var i = 0; i < rows.length; i++) { + Event.observe(rows[i], "mousedown", onRowClick); + 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]); + + for (var j = 0; j < rows[i].cells.length; j++) { + var cell = rows[i].cells[j]; + Event.observe(cell, "mousedown", listRowMouseDownHandler); + if (j == 2 || j == 3 || j == 5) + Event.observe(cell, "dblclick", onMessageDoubleClick.bindAsEventListener(cell)); + else if (j == 4) { + var img = cell.childNodesWithTag("img")[0]; + Event.observe(img, "click", mailListMarkMessage); + } } } } @@ -974,6 +1008,7 @@ function configureDragHandles() { var handle = $("verticalDragHandle"); if (handle) { handle.addInterface(SOGoDragHandlesInterface); + handle.leftMargin = 1; handle.leftBlock=$("leftPanel"); handle.rightBlock=$("rightPanel"); } @@ -988,20 +1023,20 @@ function configureDragHandles() { /* dnd */ function initDnd() { -// log ("MailerUI initDnd"); + // log("MailerUI initDnd"); - var tree = $("d"); + var tree = $("mailboxTree"); if (tree) { var images = tree.getElementsByTagName("img"); for (var i = 0; i < images.length; i++) { if (images[i].id[0] == 'j') { - images[i].dndAcceptType = mailboxSpanAcceptType; - images[i].dndEnter = plusSignEnter; - images[i].dndExit = plusSignExit; - document.DNDManager.registerDestination(images[i]); + images[i].dndAcceptType = mailboxSpanAcceptType; + images[i].dndEnter = plusSignEnter; + images[i].dndExit = plusSignExit; + document.DNDManager.registerDestination(images[i]); } } - var nodes = document.getElementsByClassName("leaf", tree); + var nodes = document.getElementsByClassName("nodeName", tree); for (var i = 0; i < nodes.length; i++) { nodes[i].dndAcceptType = mailboxSpanAcceptType; nodes[i].dndEnter = mailboxSpanEnter; @@ -1020,54 +1055,367 @@ function refreshContacts() { function openInbox(node) { var done = false; openMailbox(node.parentNode.getAttribute("dataname")); - var tree = $("d"); + var tree = $("mailboxTree"); tree.selectedEntry = node; node.select(); - var currentNode = node.parentNode.parentNode; - while (!done) { - var number = currentNode.getAttribute("id").substr(2); - d.o(number); - if (number == "1") - done = true; - else - currentNode = currentNode.parentNode; + mailboxTree.o(1); +} + +function initMailer(event) { + if (!document.body.hasClassName("popup")) { + initDnd(); + initMailboxTree(); } } -var initMailer = { - handleEvent: function (event) { - if (!document.body.hasClassName("popup")) { - var inboxFound = false; - configureMessageListEvents(); - initDnd(); - var tree = $("d"); - var nodes = document.getElementsByClassName("node", tree); - for (i = 0; i < nodes.length; i++) { - nodes[i].addEventListener("click", onMailboxTreeItemClick, false); - nodes[i].addEventListener("contextmenu", onFolderMenuClick, false); - if (!inboxFound - && nodes[i].parentNode.getAttribute("datatype") == "inbox") { - openInbox(nodes[i]); - inboxFound = true; - } +function initMailboxTree() { + mailboxTree = new dTree("mailboxTree"); + mailboxTree.config.folderLinks = true; + mailboxTree.config.hideRoot = true; + + mailboxTree.icon.root = ResourcesURL + "/tbtv_account_17x17.gif"; + mailboxTree.icon.folder = ResourcesURL + "/tbtv_leaf_corner_17x17.gif"; + mailboxTree.icon.folderOpen = ResourcesURL + "/tbtv_leaf_corner_17x17.gif"; + mailboxTree.icon.node = ResourcesURL + "/tbtv_leaf_corner_17x17.gif"; + mailboxTree.icon.line = ResourcesURL + "/tbtv_line_17x17.gif"; + mailboxTree.icon.join = ResourcesURL + "/tbtv_junction_17x17.gif"; + mailboxTree.icon.joinBottom = ResourcesURL + "/tbtv_corner_17x17.gif"; + mailboxTree.icon.plus = ResourcesURL + "/tbtv_plus_17x17.gif"; + mailboxTree.icon.plusBottom = ResourcesURL + "/tbtv_corner_plus_17x17.gif"; + mailboxTree.icon.minus = ResourcesURL + "/tbtv_minus_17x17.gif"; + mailboxTree.icon.minusBottom = ResourcesURL + "/tbtv_corner_minus_17x17.gif"; + mailboxTree.icon.nlPlus = ResourcesURL + "/tbtv_corner_plus_17x17.gif"; + mailboxTree.icon.nlMinus = ResourcesURL + "/tbtv_corner_minus_17x17.gif"; + mailboxTree.icon.empty = ResourcesURL + "/empty.gif"; + + mailboxTree.add(0, -1, ''); + + mailboxTree.pendingRequests = mailAccounts.length; + activeAjaxRequests += mailAccounts.length; + for (var i = 0; i < mailAccounts.length; i++) { + var url = ApplicationBaseURL + "/" + mailAccounts[i] + "/mailboxes"; + triggerAjaxRequest(url, onLoadMailboxesCallback, mailAccounts[i]); + } +} + +function updateMailboxTreeInPage() { + $("folderTreeContent").update(mailboxTree); + + var inboxFound = false; + 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])); + if (!inboxFound + && nodes[i].parentNode.getAttribute("datatype") == "inbox") { + openInbox(nodes[i]); + inboxFound = true; + } + } +} + +function mailboxMenuNode(type, name) { + var newNode = document.createElement("li"); + var icon = MailerUIdTreeExtension.folderIcons[type]; + if (!icon) + icon = "tbtv_leaf_corner_17x17.gif"; + var image = document.createElement("img"); + image.src = ResourcesURL + "/" + icon; + newNode.appendChild(image); + newNode.appendChild(document.createTextNode(" " + name)); + + return newNode; +} + +function generateMenuForMailbox(mailbox, prefix, callback) { + var menuDIV = document.createElement("div"); + $(menuDIV).addClassName("menu"); + menuDIV.setAttribute("id", prefix + "Submenu"); + var menu = document.createElement("ul"); + menuDIV.appendChild(menu); + + var callbacks = new Array(); + if (mailbox.type != "account") { + var newNode = document.createElement("li"); + newNode.mailbox = mailbox; + newNode.appendChild(document.createTextNode("coucou")); + menu.appendChild(newNode); + menu.appendChild(document.createElement("li")); + callbacks.push(callback); + callbacks.push("-"); + } + + var submenuCount = 0; + for (var i = 0; i < mailbox.children.length; i++) { + var child = mailbox.children[i]; + var newNode = mailboxMenuNode(child.type, child.name); + 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"); + submenuCount++; + } + else { + newNode.mailbox = child; + callbacks.push(callback); + } + } + initMenu(menuDIV, callbacks); + + return menuDIV; +} + +function updateMailboxMenus() { + var mailboxActions = { move: onMailboxMenuMove, + copy: onMailboxMenuCopy }; + + for (key in mailboxActions) { + var menuId = key + "MailboxMenu"; + var menuDIV = $(menuId); + if (menuDIV) + menuDIV.parentNode.removeChild(menuDIV); + + menuDIV = document.createElement("div"); + document.body.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")); + } + initMenu(menuDIV, submenuIds); + } +} + +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(); + } + } + + // var tree = $("mailboxTree"); + // var treeNodes = document.getElementsByClassName("dTreeNode", tree); + // var i = 0; + // while (i < treeNodes.length + // && treeNodes[i].getAttribute("dataname") != currentMailbox) + // i++; + // if (i < treeNodes.length) { + // // log("found mailbox"); + // var links = document.getElementsByClassName("node", treeNodes[i]); + // if (tree.selectedEntry) + // tree.selectedEntry.deselect(); + // links[0].select(); + // tree.selectedEntry = links[0]; + // expandUpperTree(links[0]); + // } +} + +function buildMailboxes(accountName, encoded) { + var account = new Mailbox("account", accountName); + var data = encoded.evalJSON(true); + for (var i = 0; i < data.length; i++) { + var currentNode = account; + var names = data[i].path.split("/"); + for (var j = 1; j < (names.length - 1); j++) { + var node = currentNode.findMailboxByName(names[j]); + if (!node) { + node = new Mailbox("additional", names[j]); + currentNode.addMailbox(node); } + currentNode = node; + } + var basename = names[names.length-1]; + var leaf = currentNode.findMailboxByName(basename); + if (leaf) + leaf.type = data[i].type; + else { + leaf = new Mailbox(data[i].type, basename); + currentNode.addMailbox(leaf); } + } - /* -, 'onMailboxTreeItemClick(this);' -