]> err.no Git - scalable-opengroupware.org/blobdiff - UI/WebServerResources/MailerUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1091 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / MailerUI.js
index 075d020cec8be4a3b18e5c53f7b736881cf6c441..6e30e03a6ca64563827bd969cc2a72bfb06befec 100644 (file)
@@ -1,9 +1,11 @@
 /* JavaScript for SOGoMail */
+var accounts = {};
+var mailboxTree;
 
 var currentMessages = new Array();
 var maxCachedMessages = 20;
 var cachedMessages = new Array();
-var currentMailbox = '';
+var currentMailbox = null;
 
 var usersRightsWindowHeight = 320;
 var usersRightsWindowWidth = 400;
@@ -74,7 +76,7 @@ function clickedEditorSend(sender) {
    if (!validateEditorInput(sender))
       return false;
 
-   document.pageform.action="send";
+   document.pageform.action = "send";
    document.pageform.submit();
    // if everything is ok, close the window
                       return true;
@@ -91,14 +93,14 @@ function clickedEditorAttach(sender) {
                     }
 
 function clickedEditorSave(sender) {
-   document.pageform.action="save";
+   document.pageform.action = "save";
    document.pageform.submit();
    refreshOpener();
    return true;
 }
 
 function clickedEditorDelete(sender) {
-   document.pageform.action="delete";
+   document.pageform.action = "delete";
    document.pageform.submit();
    refreshOpener();
    window.close();
@@ -120,7 +122,7 @@ function openAddressbook(sender) {
 function onMenuSharing(event) {
    var folderID = document.menuTarget.getAttribute("dataname");
    var urlstr = URLForFolderID(folderID) + "/acls";
-   event.preventDefault();
+   preventDefault(event);
 
    openAclWindow(urlstr);
 }
@@ -299,7 +301,7 @@ function uixDeleteSelectedMessages(sender) {
       var rowId = rowIds[i].substr(4);
       /* send AJAX request (synchronously) */
 
-         var messageId = currentMailbox + "/" + rowId;
+      var messageId = currentMailbox + "/" + rowId;
       url = ApplicationBaseURL + messageId + "/trash?jsonly=1";
       http = createHTTPClient();
       http.open("GET", url, false /* not async */);
@@ -339,8 +341,9 @@ function moveMessages(rowIds, folder) {
 
       /* send AJAX request (synchronously) */
          
-         var messageId = currentMailbox + "/" + rowIds[i];
-      url = ApplicationBaseURL + messageId + "/move?jsonly=1&tofolder=" + folder;
+      var messageId = currentMailbox + "/" + rowIds[i];
+      url = (ApplicationBaseURL + messageId
+            + "/move?jsonly=1&tofolder=" + folder);
       http = createHTTPClient();
       http.open("GET", url, false /* not async */);
       http.send("");
@@ -370,117 +373,143 @@ function moveMessages(rowIds, folder) {
 
 function onMenuDeleteMessage(event) {
    uixDeleteSelectedMessages();
-   event.preventDefault();
+   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;
 
-   if (this.parentNode.getAttribute("datatype") != "account")
+   search = {};
+   sorting = {};
+   $("searchValue").value = "";
+   initCriteria();
+
+   var datatype = this.parentNode.getAttribute("datatype");
+   if (datatype == "account" || datatype == "additional") {
+      currentMailbox = mailbox;
+      $("messageContent").innerHTML = "";
+      var body = $("messageList").tBodies[0];
+      for (var i = body.rows.length - 1; i > 0; i--)
+        body.deleteRow(i);
+   }
+   else
       openMailbox(mailbox);
-   event.preventDefault();
+   
+   preventDefault(event);
 }
 
-function _refreshWindowMailbox() {
-   openMailbox(currentMailbox, true);
+function onMailboxMenuMove() {
+   window.alert("unimplemented");
+}
+
+function onMailboxMenuCopy() {
+   window.alert("unimplemented");
 }
 
 function refreshMailbox() {
    var topWindow = getTopWindow();
    if (topWindow)
-      topWindow._refreshWindowMailbox();
-   
+      topWindow.refreshCurrentFolder();
+
    return false;
 }
 
-function openMailbox(mailbox, reload) {
+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;');
-        }
+
+      if (currentMessages[mailbox]) {
+        loadMessage(currentMessages[mailbox]);
+        url += '&pageforuid=' + currentMessages[mailbox];
       }
-   }
-   //   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=" + 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') });
+      }
 
-   if (document.messageListAjaxRequest) {
-      document.messageListAjaxRequest.aborted = true;
-      document.messageListAjaxRequest.abort();
+      document.messageListAjaxRequest
+        = triggerAjaxRequest(url, messageListCallback,
+                             currentMessages[mailbox]);
    }
-   document.messageListAjaxRequest
-      = triggerAjaxRequest(url, messageListCallback);
+}
 
-   return false;
+function openMailboxAtIndex(event) {
+   openMailbox(currentMailbox, true, this.getAttribute("idx"));
+
+   preventDefault(event);
 }
 
 function messageListCallback(http) {
    var div = $('mailboxContent');
-
+   
    if (http.readyState == 4
        && http.status == 200) {
       document.messageListAjaxRequest = null;
       div.innerHTML = http.responseText;
       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 onMessageContextMenu(event) {
-   log("messagelistmenu");
    var menu = $('messageListMenu');
    Event.observe(menu, "hideMenu", onMessageContextMenuHide);
    popupMenu(event, "messageListMenu", this);
@@ -513,8 +542,6 @@ 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";
@@ -533,17 +560,19 @@ function onFolderMenuClick(event) {
    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');
+   var topNode = $("mailboxTree");
 
    if (topNode.menuSelectedEntry) {
       topNode.menuSelectedEntry.deselect();
@@ -609,6 +638,7 @@ function storeCachedMessage(cachedMessage) {
 
 function onMessageSelectionChange() {
    var rows = this.getSelectedRowsId();
+
    if (rows.length == 1) {
       var idx = rows[0].substr(4);
 
@@ -646,12 +676,12 @@ function configureLinksInMessage() {
    var messageDiv = $('messageContent');
    var mailContentDiv = document.getElementsByClassName('mailer_mailcontent',
                                                        messageDiv)[0];
-   Event.observe(mailContentDiv, "contextmenu", onMessageContentMenu);
+   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);
-        Event.observe(anchors[i], "contextmenu", onEmailAddressClick);
+        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);
@@ -667,7 +697,7 @@ function onEmailAddressClick(event) {
 
 function onMessageAnchorClick (event) {
    window.open(this.href);
-   event.preventDefault();
+   preventDefault(event);
 }
 
 function messageCallback(http) {
@@ -678,7 +708,7 @@ function messageCallback(http) {
       document.messageAjaxRequest = null;
       div.innerHTML = http.responseText;
       configureLinksInMessage();
-
+      
       if (http.callbackData) {
         var cachedMessage = new Array();
         cachedMessage['idx'] = currentMailbox + '/' + http.callbackData;
@@ -689,7 +719,7 @@ function messageCallback(http) {
       }
    }
    else
-      log ("ajax fuckage");
+      log("messageCallback: problem during ajax request: " + http.status);
 }
 
 function processMailboxMenuAction(mailbox) {
@@ -808,52 +838,40 @@ function expandUpperTree(node) {
         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);
+           var cn = mailboxTree.aNodes[number];
+           mailboxTree.nodeStatus(1, number, cn._ls);
         }
       }
       currentNode = currentNode.parentNode;
    }
 }
 
-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]);
-   }
-}
-
 function onHeaderClick(event) {
-   if (document.messageListAjaxRequest) {
-      document.messageListAjaxRequest.aborted = true;
-      document.messageListAjaxRequest.abort();
+   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");
+   preventDefault(event);
+}
 
-   return false;
+function refreshCurrentFolder() {
+   openMailbox(currentMailbox, true);
 }
 
 function pouetpouet(event) {
@@ -888,8 +906,8 @@ var mailboxSpanDrop = function(data) {
 
 var plusSignEnter = function() {
    var nodeNr = parseInt(this.id.substr(2));
-   if (!d.aNodes[nodeNr]._io)
-   this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000);
+   if (!mailboxTree.aNodes[nodeNr]._io)
+     this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000);
 }
 
 var plusSignExit = function() {
@@ -900,8 +918,8 @@ var plusSignExit = function() {
 }
 
 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;
 }
 
@@ -915,14 +933,14 @@ var messageListGhost = function () {
    newDiv.ghostOffsetX = 10;
    newDiv.ghostOffsetY = 5;
 
-   var imgCode = '<img src="' + ResourcesURL + '/message-mail.png" />';
+   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 + '<br />' + 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;
 }
@@ -936,34 +954,49 @@ 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) {
-      Event.observe(messageList, "selectionchange", onMessageSelectionChange);
-      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++) {
-           Event.observe(rows[i], "mousedown", onRowClick);
-           Event.observe(rows[i], "contextmenu", onMessageContextMenu);
-           
-           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);
-              else if (j == 4) {
-                 var img = cell.childNodesWithTag("img")[0];
-                 Event.observe(img, "click", mailListMarkMessage);
-              }
+      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);
            }
         }
       }
@@ -988,9 +1021,9 @@ 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++) {
@@ -1020,89 +1053,334 @@ 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;
-   }
-}
-
-function configureSearchField() {
-   var searchValue = $("searchValue");
-
-   Event.observe(searchValue, "mousedown", onSearchMouseDown);
-   Event.observe(searchValue, "click", popupSearchMenu);
-   Event.observe(searchValue, "blur", onSearchBlur);
-   Event.observe(searchValue, "focus", onSearchFocus);
-   Event.observe(searchValue, "keydown", onSearchKeyDown);
+   mailboxTree.o(1);
 }
 
 function initMailer(event) {
    if (!document.body.hasClassName("popup")) {
-      configureSearchField();
-      var inboxFound = false;
       configureMessageListEvents();
       initDnd();
-      var tree = $("d");
-      var nodes = document.getElementsByClassName("node", tree);
-      for (i = 0; i < nodes.length; i++) {
-        Event.observe(nodes[i], "click", onMailboxTreeItemClick);
-        Event.observe(nodes[i], "contextmenu", onFolderMenuClick);
-        if (!inboxFound
-            && nodes[i].parentNode.getAttribute("datatype") == "inbox") {
-           openInbox(nodes[i]);
-           inboxFound = true;
+      currentMailbox = "/" + accounts[0] + "/INBOX";
+      initMailboxTree();
+   }
+}
+
+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;
+   for (var i = 0; i < mailAccounts.length; i++) {
+      var url = ApplicationBaseURL + "/" + mailAccounts[i] + "/mailboxes";
+      triggerAjaxRequest(url, onLoadMailboxesCallback, mailAccounts[i]);
+   }
+}
+
+function updateMailboxTreeInPage() {
+   $("folderTreeContent").innerHTML = 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) {
+      var newAccount = buildMailboxes(http.callbackData,
+                                     http.responseText);
+      accounts[http.callbackData] = newAccount;
+      mailboxTree.addMailAccount(newAccount);
+      mailboxTree.pendingRequests--;
+      if (!mailboxTree.pendingRequests) {
+       updateMailboxTreeInPage();
+       updateMailboxMenus();
+      }
+  }
+
+//       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);
       }
    }
+
+   return account;
+}
+
+function onMenuCreateFolder(event) {
+   var name = window.prompt(labels["Name :"].decodeEntities(), "");
+   if (name && name.length > 0) {
+      var folderID = document.menuTarget.getAttribute("dataname");
+      var urlstr = URLForFolderID(folderID) + "/createFolder?name=" + name;
+      triggerAjaxRequest(urlstr, folderOperationCallback);
+   }
+}
+
+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");
+      var urlstr = URLForFolderID(folderID) + "/renameFolder?name=" + name;
+      triggerAjaxRequest(urlstr, folderOperationCallback);
+   }
 }
 
-function initializeMenus() {
-   menus["menuIds"] = new Array("accountIconMenu", "inboxIconMenu",
-                               "trashIconMenu", "mailboxIconMenu",
-                               "addressMenu", "messageListMenu",
-                               "messageContentMenu", "label-menu",
-                               "mark-menu");
-   menus["accountIconMenu"] = new Array(null, null, null, null, null, null,
-                                       null, null, null, onMenuSharing);
-   menus["inboxIconMenu"] = new Array(null, null, null, "-", null, null,
-                                     null, "-", null, onMenuSharing);
-   menus["trashIconMenu"] = new Array(null, null, null, "-", null, null, null,
-                                     null, "-", null, onMenuSharing);
-   menus["mailboxIconMenu"] = new Array(null, null, null, "-", null, null,
-                                       null, null, null, "-", null,
+function onMenuDeleteFolder(event) {
+   var answer = window.confirm(labels["Do you really want to move this folder into the trash ?"].decodeEntities());
+   if (answer) {
+      var folderID = document.menuTarget.getAttribute("dataname");
+      var urlstr = URLForFolderID(folderID) + "/deleteFolder";
+      triggerAjaxRequest(urlstr, folderOperationCallback);
+   }
+}
+
+function onMenuEmptyTrash(event) {
+   var folderID = document.menuTarget.getAttribute("dataname");
+   var urlstr = URLForFolderID(folderID) + "/emptyTrash";
+   triggerAjaxRequest(urlstr, folderOperationCallback);
+}
+
+function folderOperationCallback(http) {
+   if (http.readyState == 4
+       && http.status == 204)
+      initMailboxTree();
+   else
+      window.alert(labels["Operation failed"].decodeEntities());
+}
+
+function getMenus() {
+   var menus = {}
+   menus["accountIconMenu"] = new Array(null, null, onMenuCreateFolder, null,
+                                       null, null);
+   menus["inboxIconMenu"] = new Array(null, null, null, "-", null,
+                                     onMenuCreateFolder, null, "-", null,
+                                     onMenuSharing);
+   menus["trashIconMenu"] = new Array(null, null, null, "-", null,
+                                     onMenuCreateFolder, null,
+                                     onMenuEmptyTrash, "-", null,
+                                     onMenuSharing);
+   menus["mailboxIconMenu"] = new Array(null, null, null, "-", null,
+                                       onMenuCreateFolder,
+                                       onMenuRenameFolder,
+                                       null, onMenuDeleteFolder, "-", null,
                                        onMenuSharing);
    menus["addressMenu"] = new Array(newContactFromEmail, newEmailTo, null);
    menus["messageListMenu"] = new Array(onMenuOpenMessage, "-",
                                        onMenuReplyToSender,
                                        onMenuReplyToAll,
                                        onMenuForwardMessage, null,
-                                       "-", "mailboxes-menu",
-                                       "mailboxes-menu", "label-menu",
+                                       "-", "moveMailboxMenu",
+                                       "copyMailboxMenu", "label-menu",
                                        "mark-menu", "-", null, null,
                                        null, onMenuDeleteMessage);
    menus["messageContentMenu"] = new Array(onMenuReplyToSender,
                                           onMenuReplyToAll,
                                           onMenuForwardMessage,
-                                          null,
-                                          "mailboxes-menu",
-                                          "mailboxes-menu",
+                                          null, "moveMailboxMenu",
+                                          "copyMailboxMenu",
                                           "-", "label-menu", "mark-menu",
-                                           "-", null, null, null,
+                                          "-",
+                                          null, null, null,
                                           onMenuDeleteMessage);
    menus["label-menu"] = new Array(null, "-", null , null, null, null , null,
                                   null);
    menus["mark-menu"] = new Array(null, null, null, null, "-", null, "-",
                                  null, null, null);
+   menus["searchMenu"] = new Array(setSearchCriteria, setSearchCriteria,
+                                  setSearchCriteria, setSearchCriteria,
+                                  setSearchCriteria);
+
+   return menus;
+}
+
+addEvent(window, 'load', initMailer);
+
+function Mailbox(type, name) {
+   this.type = type;
+   this.name = name;
+   this.parentFolder = null;
+   this.children = new Array();
+   return this;
+}
+
+Mailbox.prototype.dump = function(indent) {
+   if (!indent)
+     indent = 0;
+   log(" ".repeat(indent) + this.name);
+   for (var i = 0; i < this.children.length; i++) {
+      this.children[i].dump(indent + 2);
+   }
+}
 
-   initMenus();
+Mailbox.prototype.findMailboxByName = function(name) {
+   var mailbox = null;
+
+   var i = 0;
+   while (!mailbox && i <this.children.length)
+      if (this.children[i].name == name)
+        mailbox = this.children[i];
+      else
+        i++;
+
+   return mailbox;
 }
 
-Event.observe(window, "load", initMailer);
+Mailbox.prototype.addMailbox = function(mailbox) {
+   mailbox.parentFolder = this;
+   this.children.push(mailbox);
+}