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