]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/MailerUI.js
initial sync
[scalable-opengroupware.org] / UI / WebServerResources / MailerUI.js
1 /*
2   Copyright (C) 2005 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
6   OGo is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with OGo; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21 /* JavaScript for SOGo Mailer */
22
23 /*
24   DOM ids available in mail list view:
25     row_$msgid
26     div_$msgid
27     readdiv_$msgid
28     unreaddiv_$msgid
29
30   Window Properties:
31     width, height
32     bool: resizable, scrollbars, toolbar, location, directories, status,
33           menubar, copyhistory
34 */
35
36 var currentMessages = new Array();
37 var maxCachedMessages = 20;
38 var cachedMessages = new Array();
39 var currentMailbox = '';
40 /* mail list */
41
42 function openMessageWindow(msguid, url) {
43   var wId = '';
44   if (msguid) {
45     wId += "SOGo_msg_" + msguid;
46     markMailReadInWindow(window, msguid);
47   }
48   var msgWin = window.open(url, wId,
49                            "width=680,height=520,resizable=1,scrollbars=1,toolbar=0,"
50                            + "location=0,directories=0,status=0,menubar=0,copyhistory=0");
51   if (msguid) {
52     msgWin.messageId = msguid;
53     msgWin.messageURL = ApplicationBaseURL + currentMailbox + "/" + msguid;
54   }
55   msgWin.focus();
56
57   return false;
58 }
59
60 function onMessageDoubleClick(event) {
61   resetSelection(window);
62   var msguid = this.parentNode.id.substr(4);
63   
64   return openMessageWindow(msguid,
65                            ApplicationBaseURL + currentMailbox + "/"
66                            + msguid + "/popupview");
67 }
68
69 function toggleMailSelect(sender) {
70   var row;
71   row = $(sender.name);
72   row.className = sender.checked ? "tableview_selected" : "tableview";
73 }
74
75 function clearSearch(sender) {
76   var searchField = window.$("search");
77   if (searchField) searchField.value="";
78   return true;
79 }
80
81 /* mail editor */
82
83 function validateEditorInput(sender) {
84   var errortext = "";
85   var field;
86   
87   field = document.pageform.subject;
88   if (field.value == "")
89     errortext = errortext + labels.error_missingsubject + "\n";
90
91   if (!UIxRecipientSelectorHasRecipients())
92     errortext = errortext + labels.error_missingrecipients + "\n";
93   
94   if (errortext.length > 0) {
95     alert(labels.error_validationfailed.decodeEntities() + ":\n"
96           + errortext.decodeEntities());
97     return false;
98   }
99   return true;
100 }
101
102 function clickedEditorSend(sender) {
103   if (!validateEditorInput(sender))
104     return false;
105
106   document.pageform.action="send";
107   document.pageform.submit();
108   // if everything is ok, close the window
109   return true;
110 }
111
112 function clickedEditorAttach(sender) {
113   var urlstr;
114   
115   urlstr = "viewAttachments";
116   window.open(urlstr, "SOGo_attach",
117               "width=320,height=320,resizable=1,scrollbars=1,toolbar=0," +
118               "location=0,directories=0,status=0,menubar=0,copyhistory=0");
119   return false; /* stop following the link */
120 }
121
122 function clickedEditorSave(sender) {
123   document.pageform.action="save";
124   document.pageform.submit();
125   refreshOpener();
126   return true;
127 }
128
129 function clickedEditorDelete(sender) {
130   document.pageform.action="delete";
131   document.pageform.submit();
132   refreshOpener();
133   window.close();
134   return true;
135 }
136
137 function openAddressbook(sender) {
138   var urlstr;
139   
140   urlstr = ApplicationBaseURL + "/../Contacts/?popup=YES";
141   var w = window.open(urlstr, "Addressbook",
142                       "width=640,height=400,resizable=1,scrollbars=1,toolbar=0,"
143                       + "location=0,directories=0,status=0,menubar=0,copyhistory=0");
144   w.focus();
145
146   return false;
147 }
148
149 /* mail list DOM changes */
150
151 function markMailInWindow(win, msguid, markread) {
152   var msgDiv;
153
154   msgDiv = win.$("div_" + msguid);
155   if (msgDiv) {
156     if (markread) {
157       msgDiv.removeClassName("mailer_unreadmailsubject");
158       msgDiv.addClassName("mailer_readmailsubject");
159       msgDiv = win.$("unreaddiv_" + msguid);
160       if (msgDiv)
161         {
162           msgDiv.setAttribute("class", "mailerUnreadIcon");
163           msgDiv.setAttribute("id", "readdiv_" + msguid);
164           msgDiv.setAttribute("src", ResourcesURL + "/icon_read.gif");
165           msgDiv.setAttribute("onclick", "mailListMarkMessage(this,"
166                               + " 'markMessageUnread', " + msguid
167                               + ", false);"
168                               +" return false;");
169           var title = msgDiv.getAttribute("title-markunread");
170           if (title)
171             msgDiv.setAttribute("title", title);
172         }
173     }
174     else {
175       msgDiv.removeClassName('mailer_readmailsubject');
176       msgDiv.addClassName('mailer_unreadmailsubject');
177       msgDiv = win.$("readdiv_" + msguid);
178       if (msgDiv)
179         {
180           msgDiv.setAttribute("class", "mailerReadIcon");
181           msgDiv.setAttribute("id", "unreaddiv_" + msguid);
182           msgDiv.setAttribute("src", ResourcesURL + "/icon_unread.gif");
183           msgDiv.setAttribute("onclick", "mailListMarkMessage(this,"
184                               + " 'markMessageRead', " + msguid
185                               + ", true);"
186                               +" return false;");
187           var title = msgDiv.getAttribute("title-markread");
188           if (title)
189             msgDiv.setAttribute("title", title);
190         }
191     }
192     return true;
193   }
194   else
195     return false;
196 }
197
198 function markMailReadInWindow(win, msguid) {
199   /* this is called by UIxMailView with window.opener */
200   return markMailInWindow(win, msguid, true);
201 }
202
203 /* main window */
204
205 function reopenToRemoveLocationBar() {
206   // we cannot really use this, see below at the close comment
207   if (window.locationbar && window.locationbar.visible) {
208     newwin = window.open(window.location.href, "SOGo",
209                          "width=800,height=600,resizable=1,scrollbars=1," +
210                          "toolbar=0,location=0,directories=0,status=0," + 
211                          "menubar=0,copyhistory=0");
212     if (newwin) {
213       window.close(); // this does only work for windows opened by scripts!
214       newwin.focus();
215       return true;
216     }
217     return false;
218   }
219   return true;
220 }
221
222 /* mail list reply */
223
224 function openMessageWindowsForSelection(action)
225 {
226   if (document.body.hasClassName("popup"))
227     win = openMessageWindow(window.messageId,
228                             window.messageURL + "/" + action /* url */);
229   else {
230   var messageList = $("messageList");
231   var rows  = messageList.getSelectedRowsId();
232   var idset = "";
233   for (var i = 0; i < rows.length; i++)
234     win = openMessageWindow(rows[i].substr(4)        /* msguid */,
235                             ApplicationBaseURL + currentMailbox
236                             + "/" + rows[i].substr(4)
237                             + "/" + action /* url */);
238   }
239
240   return false;
241 }
242
243 function mailListMarkMessage(event) {
244   var http = createHTTPClient();
245   var url = ApplicationBaseURL + currentMailbox + "/" + action + "?uid=" + msguid;
246
247   if (http) {
248     // TODO: add parameter to signal that we are only interested in OK
249     http.open("POST", url + "&jsonly=1", false /* not async */);
250     http.send("");
251     if (http.status != 200) {
252       // TODO: refresh page?
253       alert("Message Mark Failed: " + http.statusText);
254       window.location.reload();
255     }
256     else {
257       markMailInWindow(window, msguid, markread);
258     }
259   }
260   else {
261     window.location.href = url;
262   }
263 }
264
265 /* maillist row highlight */
266
267 var oldMaillistHighlight = null; // to remember deleted/selected style
268
269 function ml_highlight(sender)
270 {
271   oldMaillistHighlight = sender.className;
272   if (oldMaillistHighlight == "tableview_highlight")
273     oldMaillistHighlight = null;
274   sender.className = "tableview_highlight";
275 }
276
277 function ml_lowlight(sender)
278 {
279   if (oldMaillistHighlight) {
280     sender.className = oldMaillistHighlight;
281     oldMaillistHighlight = null;
282   }
283   else
284     sender.className = "tableview";
285 }
286
287
288 /* folder operations */
289
290 function ctxFolderAdd(sender) {
291   var folderName;
292   
293   folderName = prompt("Foldername: ");
294   if (folderName == undefined)
295     return false;
296   if (folderName == "")
297     return false;
298   
299   // TODO: should use a form-POST or AJAX
300   window.location.href = "createFolder?name=" + escape(folderName);
301   return false;
302 }
303
304 function ctxFolderDelete(sender) {
305   if (!confirm("Delete current folder?").decodeEntities())
306     return false;
307   
308   // TODO: should use a form-POST or AJAX
309   window.location.href = "deleteFolder";
310   return false;
311 }
312
313 /* bulk delete of messages */
314
315 function uixDeleteSelectedMessages(sender) {
316   var failCount = 0;
317   
318   var messageList = $("messageList");
319   var rowIds = messageList.getSelectedRowsId();
320
321   for (var i = 0; i < rowIds.length; i++) {
322     var url, http;
323     var rowId = rowIds[i].substr(4);
324     /* send AJAX request (synchronously) */
325
326     var messageId = currentMailbox + "/" + rowId;
327     url = ApplicationBaseURL + messageId + "/trash?jsonly=1";
328     http = createHTTPClient();
329     http.open("GET", url, false /* not async */);
330     http.send("");
331     if (http.status != 200) { /* request failed */
332       failCount++;
333       http = null;
334       continue;
335     } else {
336       deleteCachedMessage(messageId);
337       if (currentMessages[currentMailbox] == rowId) {
338         var div = $('messageContent');
339         div.innerHTML = "";
340         currentMessages[currentMailbox] = null;
341       }
342     }
343     http = null;
344
345     /* remove from page */
346
347     /* line-through would be nicer, but hiding is OK too */
348     var row = $(rowIds[i]);
349     row.parentNode.removeChild(row);
350   }
351
352   if (failCount > 0)
353     alert("Could not delete " + failCount + " messages!");
354   
355   return false;
356 }
357
358 function moveMessages(rowIds, folder) {
359   var failCount = 0;
360
361   for (var i = 0; i < rowIds.length; i++) {
362     var url, http;
363
364     /* send AJAX request (synchronously) */
365     
366     var messageId = currentMailbox + "/" + rowIds[i];
367     url = ApplicationBaseURL + messageId + "/move?jsonly=1&tofolder=" + folder;
368     http = createHTTPClient();
369     http.open("GET", url, false /* not async */);
370     http.send("");
371     if (http.status == 200) {
372       var row = $("row_" + rowIds[i]);
373       row.parentNode.removeChild(row);
374       deleteCachedMessage(messageId);
375       if (currentMessages[currentMailbox] == rowIds[i]) {
376         var div = $('messageContent');
377         div.innerHTML = "";
378         currentMessages[currentMailbox] = null;
379       }
380     }
381     else /* request failed */
382       failCount++;
383
384     /* remove from page */
385
386     /* line-through would be nicer, but hiding is OK too */
387   }
388
389   if (failCount > 0)
390     alert("Could not move " + failCount + " messages!");
391   
392   return failCount;
393 }
394
395 function onMenuDeleteMessage(event) {
396   uixDeleteSelectedMessages();
397   event.preventDefault();
398 }
399
400 function onMailboxTreeItemClick(event) {
401   var topNode = $('d');
402   var mailbox = this.parentNode.getAttribute("dataname");
403
404   if (topNode.selectedEntry)
405     topNode.selectedEntry.deselect();
406   this.select();
407   topNode.selectedEntry = this;
408
409   openMailbox(mailbox);
410   event.preventDefault();
411 }
412
413 function refreshMailbox() {
414   openMailbox(currentMailbox, true);
415
416   return false;
417 }
418
419 function openMailbox(mailbox, reload)
420 {
421   if (mailbox != currentMailbox || reload) {
422     currentMailbox = mailbox;
423     var url = ApplicationBaseURL + mailbox + "/view?noframe=1&desc=1";
424     var mailboxContent = $("mailboxContent");
425     var rightDragHandle = $("rightDragHandle");
426     var messageContent = $("messageContent");
427     messageContent.innerHTML = '';
428     if (mailbox.lastIndexOf("/") == 0) {
429       var url = (ApplicationBaseURL + currentMailbox + "/"
430                  + "/view?noframe=1");
431       if (document.messageAjaxRequest) {
432         document.messageAjaxRequest.aborted = true;
433         document.messageAjaxRequest.abort();
434       }
435       document.messageAjaxRequest
436         = triggerAjaxRequest(url, messageCallback);
437       mailboxContent.innerHTML = '';
438       mailboxContent.style.visibility = "hidden;";
439       rightDragHandle.style.visibility = "hidden;";
440       messageContent.style.top = "0px;";
441     } else {
442       if (document.messageListAjaxRequest) {
443         document.messageListAjaxRequest.aborted = true;
444         document.messageListAjaxRequest.abort();
445       }
446       if (currentMessages[mailbox]) {
447         loadMessage(currentMessages[mailbox]);
448         url += '&pageforuid=' + currentMessages[mailbox];
449       }
450       document.messageListAjaxRequest
451         = triggerAjaxRequest(url, messageListCallback,
452                              currentMessages[mailbox]);
453       if (mailboxContent.style.visibility == "hidden") {
454         mailboxContent.style.visibility = "visible;";
455         rightDragHandle.style.visibility = "visible;";
456         messageContent.style.top = (rightDragHandle.offsetTop
457                                     + rightDragHandle.offsetHeight
458                                     + 'px;');
459       }
460     }
461   }
462 //   triggerAjaxRequest(mailbox, 'toolbar', toolbarCallback);
463 }
464
465 function openMailboxAtIndex(element) {
466   var idx = element.getAttribute("idx");
467   var url = ApplicationBaseURL + currentMailbox + "/view?noframe=1&idx=" + idx;
468
469   if (document.messageListAjaxRequest) {
470     document.messageListAjaxRequest.aborted = true;
471     document.messageListAjaxRequest.abort();
472   }
473   document.messageListAjaxRequest
474     = triggerAjaxRequest(url, messageListCallback);
475
476   return false;
477 }
478
479 function messageListCallback(http)
480 {
481   var div = $('mailboxContent');
482
483   if (http.readyState == 4
484       && http.status == 200) {
485     document.messageListAjaxRequest = null;
486     div.innerHTML = http.responseText;
487     var selected = http.callbackData;
488     if (selected) {
489       var row = $('row_' + selected);
490       row.select();
491     }
492     configureMessageListEvents();
493     configureSortableTableHeaders();
494   }
495   else
496     log ("ajax fuckage");
497 }
498
499 function onMessageContextMenu(event)
500 {
501   var menu = $('messageListMenu');
502   menu.addEventListener("hideMenu", onMessageContextMenuHide, false);
503   onMenuClick(event, 'messageListMenu');
504
505   var topNode = $('messageList');
506   var selectedNodes = topNode.getSelectedRows();
507   for (var i = 0; i < selectedNodes.length; i++)
508     selectedNodes[i].deselect();
509   topNode.menuSelectedRows = selectedNodes;
510   topNode.menuSelectedEntry = this;
511   this.select();
512 }
513
514 function onMessageContextMenuHide(event)
515 {
516   var topNode = $('messageList');
517
518   if (topNode.menuSelectedEntry) {
519     topNode.menuSelectedEntry.deselect();
520     topNode.menuSelectedEntry = null;
521   }
522   if (topNode.menuSelectedRows) {
523     var nodes = topNode.menuSelectedRows;
524     for (var i = 0; i < nodes.length; i++)
525       nodes[i].select();
526     topNode.menuSelectedRows = null;
527   }
528 }
529
530 function onFolderMenuClick(event)
531 {
532   var onhide, menuName;
533   
534   var menutype = this.parentNode.getAttribute("datatype");
535   log("parentNode: " + this.parentNode.tagName);
536   log("menutype: " + menutype);
537   if (menutype) {
538     if (menutype == "inbox") {
539       menuName = "inboxIconMenu";
540     } else if (menutype == "account") {
541       menuName = "accountIconMenu";
542     } else if (menutype == "trash") {
543       menuName = "trashIconMenu";
544     } else {
545       menuName = "mailboxIconMenu";
546     }
547   } else {
548     menuName = "mailboxIconMenu";
549   }
550
551   var menu = $(menuName);
552   menu.addEventListener("hideMenu", onFolderMenuHide, false);
553   onMenuClick(event, menuName);
554
555   var topNode = $('d');
556   if (topNode.selectedEntry)
557     topNode.selectedEntry.deselect();
558   if (topNode.menuSelectedEntry)
559     topNode.menuSelectedEntry.deselect();
560   topNode.menuSelectedEntry = this;
561   this.select();
562 }
563
564 function onFolderMenuHide(event)
565 {
566   var topNode = $('d');
567
568   if (topNode.menuSelectedEntry) {
569     topNode.menuSelectedEntry.deselect();
570     topNode.menuSelectedEntry = null;
571   }
572   if (topNode.selectedEntry)
573     topNode.selectedEntry.select();
574 }
575
576 function deleteCachedMessage(messageId) {
577   var done = false;
578   var counter = 0;
579
580   while (counter < cachedMessages.length
581          && !done)
582     if (cachedMessages[counter]
583         && cachedMessages[counter]['idx'] == messageId) {
584       cachedMessages.splice(counter, 1);
585       done = true;
586     }
587     else
588       counter++;
589 }
590
591 function getCachedMessage(idx)
592 {
593   var message = null;
594   var counter = 0;
595
596   while (counter < cachedMessages.length
597          && message == null)
598     if (cachedMessages[counter]
599         && cachedMessages[counter]['idx'] == currentMailbox + '/' + idx)
600       message = cachedMessages[counter];
601     else
602       counter++;
603
604   return message;
605 }
606
607 function storeCachedMessage(cachedMessage)
608 {
609   var oldest = -1;
610   var timeOldest = -1;
611   var counter = 0;
612
613   if (cachedMessages.length < maxCachedMessages)
614     oldest = cachedMessages.length;
615   else {
616     while (cachedMessages[counter]) {
617       if (oldest == -1
618           || cachedMessages[counter]['time'] < timeOldest) {
619         oldest = counter;
620         timeOldest = cachedMessages[counter]['time'];
621       }
622       counter++;
623     }
624
625     if (oldest == -1)
626       oldest = 0;
627   }
628
629   cachedMessages[oldest] = cachedMessage;
630 }
631
632 function onMessageSelectionChange()
633 {
634   var rows = this.getSelectedRowsId();
635   if (rows.length == 1) {
636     var idx = rows[0].substr(4);
637
638     if (currentMessages[currentMailbox] != idx) {
639       currentMessages[currentMailbox] = idx;
640       loadMessage(idx);
641     }
642   }
643 }
644
645 function loadMessage(idx)
646 {
647   var cachedMessage = getCachedMessage(idx);
648
649   if (document.messageAjaxRequest) {
650     document.messageAjaxRequest.aborted = true;
651     document.messageAjaxRequest.abort();
652   }
653
654   if (cachedMessage == null) {
655     var url = (ApplicationBaseURL + currentMailbox + "/"
656                + idx + "/view?noframe=1");
657     document.messageAjaxRequest
658       = triggerAjaxRequest(url, messageCallback, idx);
659     markMailInWindow(window, idx, true);
660   } else {
661     var div = $('messageContent');
662     div.innerHTML = cachedMessage['text'];
663     cachedMessage['time'] = (new Date()).getTime();
664     document.messageAjaxRequest = null;
665   }
666 }
667
668 function messageCallback(http)
669 {
670   var div = $('messageContent');
671
672   if (http.readyState == 4
673       && http.status == 200) {
674     document.messageAjaxRequest = null;
675     div.innerHTML = http.responseText;
676     
677     if (http.callbackData) {
678       var cachedMessage = new Array();
679       cachedMessage['idx'] = currentMailbox + '/' + http.callbackData;
680       cachedMessage['time'] = (new Date()).getTime();
681       cachedMessage['text'] = http.responseText;
682       if (cachedMessage['text'].length < 30000)
683         storeCachedMessage(cachedMessage);
684     }
685   }
686   else
687     log ("ajax fuckage");
688 }
689
690 function processMailboxMenuAction(mailbox)
691 {
692   var currentNode, upperNode;
693   var mailboxName;
694   var action;
695
696   mailboxName = mailbox.getAttribute('mailboxname');
697   currentNode = mailbox;
698   upperNode = null;
699
700   while (currentNode
701          && !currentNode.hasAttribute('mailboxaction'))
702     currentNode = currentNode.parentNode.parentNode.parentMenuItem;
703
704   if (currentNode)
705     {
706       action = currentNode.getAttribute('mailboxaction');
707 //       var rows  = collectSelectedRows();
708 //       var rString = rows.join(', ');
709 //       alert("performing '" + action + "' on " + rString
710 //             + " to " + mailboxName);
711     }
712 }
713
714 var rowSelectionCount = 0;
715
716 validateControls();
717
718 function showElement(e, shouldShow) {
719   e.style.display = shouldShow ? "" : "none";
720 }
721
722 function enableElement(e, shouldEnable) {
723   if(!e)
724     return;
725   if(shouldEnable) {
726     if(e.hasAttribute("disabled"))
727       e.removeAttribute("disabled");
728   }
729   else {
730     e.setAttribute("disabled", "1");
731   }
732 }
733
734 function validateControls() {
735   var e = $("moveto");
736   this.enableElement(e, rowSelectionCount > 0);
737 }
738
739 function moveTo(uri) {
740   alert("MoveTo: " + uri);
741 }
742
743 function deleteSelectedMails()
744 {
745 }
746
747 /* message menu entries */
748 function onMenuOpenMessage(event)
749 {
750   var node = getParentMenu(event.target).menuTarget.parentNode;
751   var msgId = node.getAttribute('id').substr(4);
752
753   return openMessageWindow(msgId,
754                            ApplicationBaseURL + currentMailbox
755                            + "/" + msgId + "/view");
756 }
757
758 /* contacts */
759 function newContactFromEmail(sender) {
760   var mailto = sender.parentNode.parentNode.menuTarget.innerHTML;
761
762   var emailre
763     = /([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;
764   emailre.exec(mailto);
765   email = RegExp.$1;
766
767   var namere = /(\w[\w\ _-]+)\ (&lt;|<)/;
768   var c_name = '';
769   if (namere.test(mailto)) {
770     namere.exec(mailto);
771     c_name += RegExp.$1;
772   }
773
774   if (email.length > 0)
775     {
776       emailre.exec("");
777       var url = UserFolderURL + "Contacts/new?contactEmail=" + email;
778       if (c_name)
779         url += "&contactFN=" + c_name;
780       w = window.open(url, null,
781                       "width=546,height=490,resizable=1,scrollbars=1,toolbar=0,"
782                       + "location=0,directories=0,status=0,menubar=0,copyhistory=0");
783       w.focus();
784     }
785
786   return false; /* stop following the link */
787 }
788
789 function newEmailTo(sender) {
790   return openMailTo(sender.parentNode.parentNode.menuTarget.innerHTML);
791 }
792
793 function expandUpperTree(node)
794 {
795   var currentNode = node.parentNode;
796
797   while (currentNode.className != "dtree")
798     {
799       if (currentNode.className == 'clip')
800         {
801           var id = currentNode.getAttribute("id");
802           var number = parseInt(id.substr(2));
803           if (number > 0)
804             {
805               var cn = d.aNodes[number];
806               d.nodeStatus(1, number, cn._ls);
807             }
808         }
809       currentNode = currentNode.parentNode;
810     }
811 }
812
813 function initMailboxSelection(mailboxName)
814 {
815   currentMailbox = mailboxName;
816
817   var tree = $("d");
818   var treeNodes = document.getElementsByClassName("dTreeNode", tree);
819   var i = 0;
820   while (i < treeNodes.length
821          && treeNodes[i].getAttribute("dataname") != currentMailbox)
822     i++;
823   if (i < treeNodes.length) {
824     var links = document.getElementsByClassName("node", treeNodes[i]);
825     if (tree.selectedEntry)
826       tree.selectedEntry.deselect();
827     links[0].select();
828     tree.selectedEntry = links[0];
829     expandUpperTree(links[0]);
830   }
831 }
832
833 function onHeaderClick(event)
834 {
835   if (document.messageListAjaxRequest) {
836     document.messageListAjaxRequest.aborted = true;
837     document.messageListAjaxRequest.abort();
838   }
839   url = ApplicationBaseURL + currentMailbox + "/" + this.link;
840   if (!this.link.match(/noframe=/))
841     url += "&noframe=1";
842   document.messageListAjaxRequest
843     = triggerAjaxRequest(url, messageListCallback);
844
845   event.preventDefault();
846 }
847
848 function onSearchFormSubmit()
849 {
850   log ("search not implemented");
851
852   return false;
853 }
854
855 function pouetpouet(event) {
856   window.alert("pouet pouet");
857 }
858
859 var mailboxSpanAcceptType = function(type) {
860   return (type == "mailRow");
861 }
862
863 var mailboxSpanEnter = function() {
864   this.addClassName("_dragOver");
865 }
866
867 var mailboxSpanExit = function() {
868   this.removeClassName("_dragOver");
869 }
870
871 var mailboxSpanDrop = function(data) {
872   var success = false;
873
874   if (data) {
875     var folder = this.parentNode.parentNode.getAttribute("dataname");
876     if (folder != currentMailbox)
877       success = (moveMessages(data, folder) == 0);
878   }
879   else
880     success = false;
881
882   return success;
883 }
884
885 var plusSignEnter = function() {
886   var nodeNr = parseInt(this.id.substr(2));
887   if (!d.aNodes[nodeNr]._io)
888     this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000);
889 }
890
891 var plusSignExit = function() {
892   if (this.plusSignTimer) {
893     clearTimeout(this.plusSignTimer);
894     this.plusSignTimer = null;
895   }
896 }
897
898 function openPlusSign(nodeNr) {
899   d.nodeStatus(1, nodeNr, d.aNodes[nodeNr]._ls);
900   d.aNodes[nodeNr]._io = 1;
901   this.plusSignTimer = null;
902 }
903
904 var messageListGhost = function () {
905   var newDiv = document.createElement("div");
906 //   newDiv.style.width = "25px;";
907 //   newDiv.style.height = "25px;";
908   newDiv.style.backgroundColor = "#aae;";
909   newDiv.style.border = "2px solid #a3a;";
910   newDiv.style.padding = "5px;";
911   newDiv.ghostOffsetX = 10;
912   newDiv.ghostOffsetY = 5;
913
914   var imgCode = '<img src="' + ResourcesURL + '/message-mail.png" />';
915
916   var current = this;
917   while (!current.getSelectedRows)
918     current = current.parentNode;
919   var count = current.getSelectedRows().length;
920   var text = imgCode + '<br />' + count + ' messages...';
921   newDiv.innerHTML = text;
922
923   return newDiv;
924 }
925
926 var messageListData = function(type) {
927   var rows = this.getSelectedRowsId();
928   var msgIds = new Array();
929   for (var i = 0; i < rows.length; i++)
930     msgIds.push(rows[i].substr(4));
931
932   return msgIds;
933 }
934
935 function configureMessageListEvents() {
936   var messageList = $("messageList");
937   if (messageList) {
938     messageList.addEventListener("selectionchange",
939                                  onMessageSelectionChange, false);
940     var rows = messageList.tBodies[0].rows;
941     var start = 0;
942     if (rows.length > 1) {
943       while (rows[start].cells[0].hasClassName("tbtv_headercell")
944              || rows[start].cells[0].hasClassName("tbtv_navcell"))
945         start++;
946       for (var i = start; i < rows.length; i++) {
947         rows[i].addEventListener("mousedown", onRowClick, false);
948         rows[i].addEventListener("contextmenu", onMessageContextMenu, false);
949         
950         rows[i].dndTypes = function() { return new Array("mailRow"); };
951         rows[i].dndGhost = messageListGhost;
952         rows[i].dndDataForType = messageListData;
953         document.DNDManager.registerSource(rows[i]);
954         
955         for (var j = 0; j < rows[i].cells.length; j++) {
956           var cell = rows[i].cells[j];
957           cell.addEventListener("mousedown", listRowMouseDownHandler, false);
958           if (j == 2 || j == 3 || j == 5)
959             cell.addEventListener("dblclick", onMessageDoubleClick, false);
960           else if (j == 4) {
961             var img = cell.childNodesWithTag("img")[0];
962             img.addEventListener("click", mailListMarkMessage, false);
963           }
964         }
965       }
966     }
967   }
968 }
969
970 function configureDragHandles() {
971   var handle = $("verticalDragHandle");
972   if (handle) {
973     handle.addInterface(SOGoDragHandlesInterface);
974     handle.leftBlock=$("leftPanel");
975     handle.rightBlock=$("rightPanel");
976   }
977
978   handle = $("rightDragHandle");
979   if (handle) {
980     handle.addInterface(SOGoDragHandlesInterface);
981     handle.upperBlock=$("mailboxContent");
982     handle.lowerBlock=$("messageContent");
983   }
984 }
985
986 /* dnd */
987 function initDnd() {
988   log ("MailerUI initDnd");
989
990   var tree = $("d");
991   if (tree) {
992     var images = tree.getElementsByTagName("img");
993     for (var i = 0; i < images.length; i++) {
994       if (images[i].id[0] == 'j') {
995         images[i].dndAcceptType = mailboxSpanAcceptType;
996         images[i].dndEnter = plusSignEnter;
997         images[i].dndExit = plusSignExit;
998         document.DNDManager.registerDestination(images[i]);
999       }
1000     }
1001     var nodes = document.getElementsByClassName("leaf", tree);
1002     for (var i = 0; i < nodes.length; i++) {
1003       nodes[i].dndAcceptType = mailboxSpanAcceptType;
1004       nodes[i].dndEnter = mailboxSpanEnter;
1005       nodes[i].dndExit = mailboxSpanExit;
1006       nodes[i].dndDrop = mailboxSpanDrop;
1007       document.DNDManager.registerDestination(nodes[i]);
1008     }
1009   }
1010 }
1011
1012 /* stub */
1013
1014 function refreshContacts() {
1015 }
1016
1017 function openInbox(node) {
1018   var done = false;
1019   openMailbox(node.parentNode.getAttribute("dataname"));
1020   node.select();
1021   var currentNode = node.parentNode.parentNode;
1022   while (!done) {
1023     var number = currentNode.getAttribute("id").substr(2);
1024     d.o(number);
1025     if (number == "1")
1026       done = true;
1027     else
1028       currentNode = currentNode.parentNode;
1029   }
1030 }
1031
1032 var initMailer = {
1033   handleEvent: function (event) {
1034     if (!document.body.hasClassName("popup")) {
1035       var inboxFound = false;
1036       configureMessageListEvents();
1037       initDnd();
1038       var tree = $("d");
1039       var nodes = document.getElementsByClassName("node", tree);
1040       for (i = 0; i < nodes.length; i++) {
1041         nodes[i].addEventListener("click", onMailboxTreeItemClick, false);
1042         nodes[i].addEventListener("contextmenu", onFolderMenuClick, false);
1043         if (!inboxFound
1044             && nodes[i].parentNode.getAttribute("datatype") == "inbox") {
1045           openInbox(nodes[i]);
1046           inboxFound = true;
1047         }
1048       }
1049     }
1050
1051     /*
1052 , 'onMailboxTreeItemClick(this);'
1053 <!--      if (typeof(node.datatype) != "undefined") str += ' oncontextmenu="onFolderMenuClick(event, this);"';
1054
1055     */
1056
1057   }
1058 }
1059
1060 function initializeMenus() {
1061   var menus = new Array("accountIconMenu", "inboxIconMenu", "trashIconMenu",
1062                         "mailboxIconMenu", "addressMenu", "messageListMenu",
1063                         "messageContentMenu", "label-menu", "mailboxes-menu",
1064                         "mark-menu", "searchMenu");
1065   initMenusNamed(menus);
1066 }
1067
1068 window.addEventListener("load", initMailer, false);