]> err.no Git - scalable-opengroupware.org/blobdiff - UI/WebServerResources/MailerUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1180 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / MailerUI.js
index df32f1d746819e4a7373c0e46daa4961e91a8b81..074a94f944c3167deca28fc5eff81d87ca9d44cf 100644 (file)
@@ -6,6 +6,7 @@ var currentMessages = new Array();
 var maxCachedMessages = 20;
 var cachedMessages = new Array();
 var currentMailbox = null;
+var currentMailboxType = "";
 
 var usersRightsWindowHeight = 320;
 var usersRightsWindowWidth = 400;
@@ -18,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;
@@ -31,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) {
@@ -45,12 +46,6 @@ function toggleMailSelect(sender) {
   row.className = sender.checked ? "tableview_selected" : "tableview";
 }
 
-function clearSearch(sender) {
-  var searchField = window.$("search");
-  if (searchField) searchField.value="";
-  return true;
-}
-
 function openAddressbook(sender) {
   var urlstr;
    
@@ -125,40 +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 */,
-                             ApplicationBaseURL + currentMailbox
-                             + "/" + rows[i].substr(4)
-                             + "/" + action /* url */);
+    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);
+    }
   }
 
   return false;
@@ -166,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?
@@ -224,7 +207,7 @@ function ctxFolderAdd(sender) {
 }
 
 function ctxFolderDelete(sender) {
-  if (!confirm("Delete current folder?").decodeEntities())
+  if (!confirm("Delete current folder?"))
     return false;
    
   // TODO: should use a form-POST or AJAX
@@ -246,11 +229,11 @@ 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;
@@ -258,7 +241,7 @@ function uixDeleteSelectedMessages(sender) {
       deleteCachedMessage(messageId);
       if (currentMessages[currentMailbox] == rowId) {
        var div = $('messageContent');
-       div.innerHTML = "";
+       div.update();
        currentMessages[currentMailbox] = null;
       }
     }
@@ -287,7 +270,7 @@ function moveMessages(rowIds, folder) {
          
     var messageId = currentMailbox + "/" + rowIds[i];
     url = (ApplicationBaseURL + messageId
-          + "/move?jsonly=1&tofolder=" + folder);
+          + "/move?tofolder=" + folder);
     http = createHTTPClient();
     http.open("GET", url, false /* not async */);
     http.send("");
@@ -297,7 +280,7 @@ function moveMessages(rowIds, folder) {
       deleteCachedMessage(messageId);
       if (currentMessages[currentMailbox] == rowIds[i]) {
        var div = $('messageContent');
-       div.innerHTML = "";
+       div.update();
        currentMessages[currentMailbox] = null;
       }
     }
@@ -323,10 +306,10 @@ function onMenuDeleteMessage(event) {
 function onPrintCurrentMessage(event) {
   var rowIds = $("messageList").getSelectedRowsId();
   if (rowIds.length == 0) {
-    window.alert(labels["Please select a message to print."].decodeEntities());
+    window.alert(labels["Please select a message to print."]);
   }
   else if (rowIds.length > 1) {
-    window.alert(labels["Please select only one message to print."].decodeEntities());
+    window.alert(labels["Please select only one message to print."]);
   }
   else
     window.print();
@@ -348,13 +331,13 @@ function onMailboxTreeItemClick(event) {
   $("searchValue").value = "";
   initCriteria();
 
-  var datatype = this.parentNode.getAttribute("datatype");
-  if (datatype == "account" || datatype == "additional") {
+  currentMailboxType = this.parentNode.getAttribute("datatype");
+  if (currentMailboxType == "account" || currentMailboxType == "additional") {
     currentMailbox = mailbox;
-    $("messageContent").innerHTML = "";
+    $("messageContent").update();
     var body = $("messageList").tBodies[0];
-    for (var i = body.rows.length - 1; i > 0; i--)
-      body.deleteRow(i);
+    for (var i = body.rows.length; i > 0; i--)
+      body.deleteRow(i-1);
   }
   else
     openMailbox(mailbox);
@@ -378,29 +361,46 @@ function refreshMailbox() {
   return false;
 }
 
+function onComposeMessage() {
+  var topWindow = getTopWindow();
+  if (topWindow)
+    topWindow.composeNewMessage();
+
+  return false;
+}
+
+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";
     var messageContent = $("messageContent");
-    messageContent.innerHTML = '';
-      
-    if (currentMessages[mailbox]) {
-      loadMessage(currentMessages[mailbox]);
-      url += '&pageforuid=' + currentMessages[mailbox];
+    messageContent.update();
+   
+    var currentMessage;
+    if (!idx) {
+      currentMessage = currentMessages[mailbox];
+      if (currentMessage) {
+       loadMessage(currentMessage);
+       url += '&pageforuid=' + currentMessage;
+      }
     }
 
     var searchValue = search["value"];
     if (searchValue && searchValue.length > 0)
       url += ("&search=" + search["criteria"]
-             + "&value=" + searchValue);
+             + "&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();
@@ -418,7 +418,7 @@ function openMailbox(mailbox, reload, idx) {
 
     document.messageListAjaxRequest
       = triggerAjaxRequest(url, messageListCallback,
-                          currentMessages[mailbox]);
+                          currentMessage);
 
     var quotasUrl = ApplicationBaseURL + mailbox + "/quotas";
     document.quotasAjaxRequest
@@ -437,8 +437,11 @@ function messageListCallback(http) {
    
   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);
@@ -446,6 +449,7 @@ function messageListCallback(http) {
        row.select();
     }
     configureMessageListEvents();
+    
     if (sorting["attribute"] && sorting["attribute"].length > 0) {
       var sortHeader;
       if (sorting["attribute"] == "subject")
@@ -488,7 +492,7 @@ function quotasCallback(http) {
       var used = mbQuotas["usedSpace"];
       var max = mbQuotas["maxQuota"];
       var percents = (Math.round(used * 10000 / max) / 100);
-      var format = labels["quotasFormat"].decodeEntities();
+      var format = labels["quotasFormat"];
       var text = format.formatted(used, max, percents);
       window.status = text;
     }
@@ -651,7 +655,7 @@ function loadMessage(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();
@@ -675,12 +679,20 @@ function configureLinksInMessage() {
     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);
 }
@@ -696,7 +708,7 @@ function messageCallback(http) {
   if (http.readyState == 4
       && http.status == 200) {
     document.messageAjaxRequest = null;
-    div.innerHTML = http.responseText;
+    div.update(http.responseText);
     configureLinksInMessage();
       
     if (http.callbackData) {
@@ -791,9 +803,7 @@ function onMenuViewMessageSource(event) {
   if (rows.length > 0) {
     var url = (ApplicationBaseURL + currentMailbox + "/"
               + rows[0].substr(4) + "/viewsource");
-    window.open(url, "",
-               "width=680,height=520,resizable=1,scrollbars=1,toolbar=0,"
-               + "location=0,directories=0,status=0,menubar=0,copyhistory=0");
+    openMailComposeWindow(url);
   }
 
   preventDefault(event);
@@ -810,10 +820,7 @@ function newContactFromEmail(event) {
       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();
+      openContactWindow(url);
     }
 
   return false; /* stop following the link */
@@ -860,7 +867,7 @@ function onHeaderClick(event) {
 
   refreshCurrentFolder();
 
-  preventDefault(event);
+  Event.stop(event);
 }
 
 function refreshCurrentFolder() {
@@ -953,8 +960,8 @@ 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);
+                 onHeaderClick.bindAsEventListener(currentCell));
+    //Event.observe(currentCell, "mousedown", listRowMouseDownHandler);
   }
 }
 
@@ -962,9 +969,10 @@ function configureMessageListEvents() {
   var messageList = $("messageList");
   if (messageList) {
     Event.observe(messageList, "mousedown",
-                 onMessageSelectionChange.bindAsEventListener(messageList));
+                 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");
@@ -1000,6 +1008,7 @@ function configureDragHandles() {
   var handle = $("verticalDragHandle");
   if (handle) {
     handle.addInterface(SOGoDragHandlesInterface);
+    handle.leftMargin = 1;
     handle.leftBlock=$("leftPanel");
     handle.rightBlock=$("rightPanel");
   }
@@ -1054,9 +1063,7 @@ function openInbox(node) {
 
 function initMailer(event) {
   if (!document.body.hasClassName("popup")) {
-    configureMessageListEvents();
     initDnd();
-    currentMailbox = "/" + accounts[0] + "/folderINBOX";
     initMailboxTree();
   }
 }
@@ -1084,6 +1091,7 @@ function initMailboxTree() {
   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]);
@@ -1091,7 +1099,7 @@ function initMailboxTree() {
 }
 
 function updateMailboxTreeInPage() {
-  $("folderTreeContent").innerHTML = mailboxTree;
+  $("folderTreeContent").update(mailboxTree);
 
   var inboxFound = false;
   var tree = $("mailboxTree");
@@ -1198,14 +1206,17 @@ function updateMailboxMenus() {
 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();
     }
   }
 
@@ -1254,7 +1265,7 @@ function buildMailboxes(accountName, encoded) {
 }
 
 function onMenuCreateFolder(event) {
-  var name = window.prompt(labels["Name :"].decodeEntities(), "");
+  var name = window.prompt(labels["Name :"], "");
   if (name && name.length > 0) {
     var folderID = document.menuTarget.getAttribute("dataname");
     var urlstr = URLForFolderID(folderID) + "/createFolder?name=" + name;
@@ -1264,7 +1275,7 @@ function onMenuCreateFolder(event) {
 
 function onMenuRenameFolder(event) {
   var name = window.prompt(labels["Enter the new name of your folder :"]
-                          .decodeEntities(),
+                          ,
                           "");
   if (name && name.length > 0) {
     var folderID = document.menuTarget.getAttribute("dataname");
@@ -1274,7 +1285,7 @@ function onMenuRenameFolder(event) {
 }
 
 function onMenuDeleteFolder(event) {
-  var answer = window.confirm(labels["Do you really want to move this folder into the trash ?"].decodeEntities());
+  var answer = window.confirm(labels["Do you really want to move this folder into the trash ?"]);
   if (answer) {
     var folderID = document.menuTarget.getAttribute("dataname");
     var urlstr = URLForFolderID(folderID) + "/deleteFolder";
@@ -1282,10 +1293,26 @@ 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, folderOperationCallback);
+  triggerAjaxRequest(urlstr, folderRefreshCallback, folderID);
+
+  if (folderID == currentMailbox) {
+    var div = $('messageContent');
+    for (var i = div.childNodes.length - 1; i > -1; i--)
+      div.removeChild(div.childNodes[i]);
+  }
+  var msgID = currentMessages[folderID];
+  if (msgID)
+    deleteCachedMessage(folderID + "/" + msgID);
 }
 
 function folderOperationCallback(http) {
@@ -1293,7 +1320,18 @@ function folderOperationCallback(http) {
       && http.status == 204)
     initMailboxTree();
   else
-    window.alert(labels["Operation failed"].decodeEntities());
+    window.alert(labels["Operation failed"]);
+}
+
+function folderRefreshCallback(http) {
+  if (http.readyState == 4
+      && http.status == 204) {
+    var oldMailbox = http.callbackData;
+    if (oldMailbox == currentMailbox)
+      refreshCurrentFolder();
+  }
+  else
+    window.alert(labels["Operation failed"]);
 }
 
 function getMenus() {
@@ -1301,16 +1339,18 @@ function getMenus() {
   menus["accountIconMenu"] = new Array(null, null, onMenuCreateFolder, null,
                                       null, null);
   menus["inboxIconMenu"] = new Array(null, null, null, "-", null,
-                                    onMenuCreateFolder, null, "-", null,
+                                    onMenuCreateFolder, onMenuExpungeFolder,
+                                    "-", null,
                                     onMenuSharing);
   menus["trashIconMenu"] = new Array(null, null, null, "-", null,
-                                    onMenuCreateFolder, null,
+                                    onMenuCreateFolder, onMenuExpungeFolder,
                                     onMenuEmptyTrash, "-", null,
                                     onMenuSharing);
   menus["mailboxIconMenu"] = new Array(null, null, null, "-", null,
                                       onMenuCreateFolder,
                                       onMenuRenameFolder,
-                                      null, onMenuDeleteFolder, "-", null,
+                                      onMenuExpungeFolder,
+                                      onMenuDeleteFolder, "-", null,
                                       onMenuSharing);
   menus["addressMenu"] = new Array(newContactFromEmail, newEmailTo, null);
   menus["messageListMenu"] = new Array(onMenuOpenMessage, "-",