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