]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/MailerUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1017 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 {
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     log ("deselecting");
406     topNode.selectedEntry.deselect();
407   }
408   this.select();
409   topNode.selectedEntry = this;
410
411   openMailbox(mailbox);
412   event.preventDefault();
413 }
414
415 function refreshMailbox() {
416   openMailbox(currentMailbox, true);
417
418   return false;
419 }
420
421 function openMailbox(mailbox, reload)
422 {
423   if (mailbox != currentMailbox || reload) {
424     currentMailbox = mailbox;
425     var url = ApplicationBaseURL + mailbox + "/view?noframe=1&desc=1";
426     var mailboxContent = $("mailboxContent");
427     var rightDragHandle = $("rightDragHandle");
428     var messageContent = $("messageContent");
429     messageContent.innerHTML = '';
430     if (mailbox.lastIndexOf("/") == 0) {
431       var url = (ApplicationBaseURL + currentMailbox + "/"
432                  + "/view?noframe=1");
433       if (document.messageAjaxRequest) {
434         document.messageAjaxRequest.aborted = true;
435         document.messageAjaxRequest.abort();
436       }
437       document.messageAjaxRequest
438         = triggerAjaxRequest(url, messageCallback);
439       mailboxContent.innerHTML = '';
440       mailboxContent.style.visibility = "hidden;";
441       rightDragHandle.style.visibility = "hidden;";
442       messageContent.style.top = "0px;";
443     } else {
444       if (document.messageListAjaxRequest) {
445         document.messageListAjaxRequest.aborted = true;
446         document.messageListAjaxRequest.abort();
447       }
448       if (currentMessages[mailbox]) {
449         loadMessage(currentMessages[mailbox]);
450         url += '&pageforuid=' + currentMessages[mailbox];
451       }
452       document.messageListAjaxRequest
453         = triggerAjaxRequest(url, messageListCallback,
454                              currentMessages[mailbox]);
455       if (mailboxContent.style.visibility == "hidden") {
456         mailboxContent.style.visibility = "visible;";
457         rightDragHandle.style.visibility = "visible;";
458         messageContent.style.top = (rightDragHandle.offsetTop
459                                     + rightDragHandle.offsetHeight
460                                     + 'px;');
461       }
462     }
463   }
464 //   triggerAjaxRequest(mailbox, 'toolbar', toolbarCallback);
465 }
466
467 function openMailboxAtIndex(element) {
468   var idx = element.getAttribute("idx");
469   var url = ApplicationBaseURL + currentMailbox + "/view?noframe=1&idx=" + idx;
470
471   if (document.messageListAjaxRequest) {
472     document.messageListAjaxRequest.aborted = true;
473     document.messageListAjaxRequest.abort();
474   }
475   document.messageListAjaxRequest
476     = triggerAjaxRequest(url, messageListCallback);
477
478   return false;
479 }
480
481 function messageListCallback(http)
482 {
483   var div = $('mailboxContent');
484
485   if (http.readyState == 4
486       && http.status == 200) {
487     document.messageListAjaxRequest = null;
488     div.innerHTML = http.responseText;
489     var selected = http.callbackData;
490     if (selected) {
491       var row = $('row_' + selected);
492       row.select();
493     }
494     configureMessageListEvents();
495     configureSortableTableHeaders();
496   }
497   else
498     log ("ajax fuckage");
499 }
500
501 function onMessageContextMenu(event)
502 {
503   var menu = $('messageListMenu');
504   menu.addEventListener("hideMenu", onMessageContextMenuHide, false);
505   onMenuClick(event, 'messageListMenu');
506
507   var topNode = $('messageList');
508   var selectedNodes = topNode.getSelectedRows();
509   for (var i = 0; i < selectedNodes.length; i++)
510     selectedNodes[i].deselect();
511   topNode.menuSelectedRows = selectedNodes;
512   topNode.menuSelectedEntry = this;
513   this.select();
514 }
515
516 function onMessageContextMenuHide(event)
517 {
518   var topNode = $('messageList');
519
520   if (topNode.menuSelectedEntry) {
521     topNode.menuSelectedEntry.deselect();
522     topNode.menuSelectedEntry = null;
523   }
524   if (topNode.menuSelectedRows) {
525     var nodes = topNode.menuSelectedRows;
526     for (var i = 0; i < nodes.length; i++)
527       nodes[i].select();
528     topNode.menuSelectedRows = null;
529   }
530 }
531
532 function onFolderMenuClick(event)
533 {
534   var onhide, menuName;
535   
536   var menutype = this.parentNode.getAttribute("datatype");
537 //   log("parentNode: " + this.parentNode.tagName);
538 //   log("menutype: " + menutype);
539   if (menutype) {
540     if (menutype == "inbox") {
541       menuName = "inboxIconMenu";
542     } else if (menutype == "account") {
543       menuName = "accountIconMenu";
544     } else if (menutype == "trash") {
545       menuName = "trashIconMenu";
546     } else {
547       menuName = "mailboxIconMenu";
548     }
549   } else {
550     menuName = "mailboxIconMenu";
551   }
552
553   var menu = $(menuName);
554   menu.addEventListener("hideMenu", onFolderMenuHide, false);
555   onMenuClick(event, menuName);
556
557   var topNode = $('d');
558   if (topNode.selectedEntry)
559     topNode.selectedEntry.deselect();
560   if (topNode.menuSelectedEntry)
561     topNode.menuSelectedEntry.deselect();
562   topNode.menuSelectedEntry = this;
563   this.select();
564 }
565
566 function onFolderMenuHide(event)
567 {
568   var topNode = $('d');
569
570   if (topNode.menuSelectedEntry) {
571     topNode.menuSelectedEntry.deselect();
572     topNode.menuSelectedEntry = null;
573   }
574   if (topNode.selectedEntry)
575     topNode.selectedEntry.select();
576 }
577
578 function deleteCachedMessage(messageId) {
579   var done = false;
580   var counter = 0;
581
582   while (counter < cachedMessages.length
583          && !done)
584     if (cachedMessages[counter]
585         && cachedMessages[counter]['idx'] == messageId) {
586       cachedMessages.splice(counter, 1);
587       done = true;
588     }
589     else
590       counter++;
591 }
592
593 function getCachedMessage(idx)
594 {
595   var message = null;
596   var counter = 0;
597
598   while (counter < cachedMessages.length
599          && message == null)
600     if (cachedMessages[counter]
601         && cachedMessages[counter]['idx'] == currentMailbox + '/' + idx)
602       message = cachedMessages[counter];
603     else
604       counter++;
605
606   return message;
607 }
608
609 function storeCachedMessage(cachedMessage)
610 {
611   var oldest = -1;
612   var timeOldest = -1;
613   var counter = 0;
614
615   if (cachedMessages.length < maxCachedMessages)
616     oldest = cachedMessages.length;
617   else {
618     while (cachedMessages[counter]) {
619       if (oldest == -1
620           || cachedMessages[counter]['time'] < timeOldest) {
621         oldest = counter;
622         timeOldest = cachedMessages[counter]['time'];
623       }
624       counter++;
625     }
626
627     if (oldest == -1)
628       oldest = 0;
629   }
630
631   cachedMessages[oldest] = cachedMessage;
632 }
633
634 function onMessageSelectionChange()
635 {
636   var rows = this.getSelectedRowsId();
637   if (rows.length == 1) {
638     var idx = rows[0].substr(4);
639
640     if (currentMessages[currentMailbox] != idx) {
641       currentMessages[currentMailbox] = idx;
642       loadMessage(idx);
643     }
644   }
645 }
646
647 function loadMessage(idx)
648 {
649   var cachedMessage = getCachedMessage(idx);
650
651   if (document.messageAjaxRequest) {
652     document.messageAjaxRequest.aborted = true;
653     document.messageAjaxRequest.abort();
654   }
655
656   if (cachedMessage == null) {
657     var url = (ApplicationBaseURL + currentMailbox + "/"
658                + idx + "/view?noframe=1");
659     document.messageAjaxRequest
660       = triggerAjaxRequest(url, messageCallback, idx);
661     markMailInWindow(window, idx, true);
662   } else {
663     var div = $('messageContent');
664     div.innerHTML = cachedMessage['text'];
665     cachedMessage['time'] = (new Date()).getTime();
666     document.messageAjaxRequest = null;
667   }
668 }
669
670 function messageCallback(http)
671 {
672   var div = $('messageContent');
673
674   if (http.readyState == 4
675       && http.status == 200) {
676     document.messageAjaxRequest = null;
677     div.innerHTML = http.responseText;
678     
679     if (http.callbackData) {
680       var cachedMessage = new Array();
681       cachedMessage['idx'] = currentMailbox + '/' + http.callbackData;
682       cachedMessage['time'] = (new Date()).getTime();
683       cachedMessage['text'] = http.responseText;
684       if (cachedMessage['text'].length < 30000)
685         storeCachedMessage(cachedMessage);
686     }
687   }
688   else
689     log ("ajax fuckage");
690 }
691
692 function processMailboxMenuAction(mailbox)
693 {
694   var currentNode, upperNode;
695   var mailboxName;
696   var action;
697
698   mailboxName = mailbox.getAttribute('mailboxname');
699   currentNode = mailbox;
700   upperNode = null;
701
702   while (currentNode
703          && !currentNode.hasAttribute('mailboxaction'))
704     currentNode = currentNode.parentNode.parentNode.parentMenuItem;
705
706   if (currentNode)
707     {
708       action = currentNode.getAttribute('mailboxaction');
709 //       var rows  = collectSelectedRows();
710 //       var rString = rows.join(', ');
711 //       alert("performing '" + action + "' on " + rString
712 //             + " to " + mailboxName);
713     }
714 }
715
716 var rowSelectionCount = 0;
717
718 validateControls();
719
720 function showElement(e, shouldShow) {
721   e.style.display = shouldShow ? "" : "none";
722 }
723
724 function enableElement(e, shouldEnable) {
725   if(!e)
726     return;
727   if(shouldEnable) {
728     if(e.hasAttribute("disabled"))
729       e.removeAttribute("disabled");
730   }
731   else {
732     e.setAttribute("disabled", "1");
733   }
734 }
735
736 function validateControls() {
737   var e = $("moveto");
738   this.enableElement(e, rowSelectionCount > 0);
739 }
740
741 function moveTo(uri) {
742   alert("MoveTo: " + uri);
743 }
744
745 function deleteSelectedMails()
746 {
747 }
748
749 /* message menu entries */
750 function onMenuOpenMessage(event)
751 {
752   var node = getParentMenu(event.target).menuTarget.parentNode;
753   var msgId = node.getAttribute('id').substr(4);
754
755   return openMessageWindow(msgId,
756                            ApplicationBaseURL + currentMailbox
757                            + "/" + msgId + "/view");
758 }
759
760 /* contacts */
761 function newContactFromEmail(sender) {
762   var mailto = sender.parentNode.parentNode.menuTarget.innerHTML;
763
764   var emailre
765     = /([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;
766   emailre.exec(mailto);
767   email = RegExp.$1;
768
769   var namere = /(\w[\w\ _-]+)\ (&lt;|<)/;
770   var c_name = '';
771   if (namere.test(mailto)) {
772     namere.exec(mailto);
773     c_name += RegExp.$1;
774   }
775
776   if (email.length > 0)
777     {
778       emailre.exec("");
779       var url = UserFolderURL + "Contacts/new?contactEmail=" + email;
780       if (c_name)
781         url += "&contactFN=" + c_name;
782       w = window.open(url, null,
783                       "width=546,height=490,resizable=1,scrollbars=1,toolbar=0,"
784                       + "location=0,directories=0,status=0,menubar=0,copyhistory=0");
785       w.focus();
786     }
787
788   return false; /* stop following the link */
789 }
790
791 function newEmailTo(sender) {
792   return openMailTo(sender.parentNode.parentNode.menuTarget.innerHTML);
793 }
794
795 function expandUpperTree(node)
796 {
797   var currentNode = node.parentNode;
798
799   while (currentNode.className != "dtree")
800     {
801       if (currentNode.className == 'clip')
802         {
803           var id = currentNode.getAttribute("id");
804           var number = parseInt(id.substr(2));
805           if (number > 0)
806             {
807               var cn = d.aNodes[number];
808               d.nodeStatus(1, number, cn._ls);
809             }
810         }
811       currentNode = currentNode.parentNode;
812     }
813 }
814
815 function initMailboxSelection(mailboxName)
816 {
817   currentMailbox = mailboxName;
818   log("initMailboxSelection: " + mailboxName);
819   var tree = $("d");
820   var treeNodes = document.getElementsByClassName("dTreeNode", tree);
821   var i = 0;
822   while (i < treeNodes.length
823          && treeNodes[i].getAttribute("dataname") != currentMailbox)
824     i++;
825   if (i < treeNodes.length) {
826     log ("found mailbox");
827     var links = document.getElementsByClassName("node", treeNodes[i]);
828     if (tree.selectedEntry)
829       tree.selectedEntry.deselect();
830     links[0].select();
831     tree.selectedEntry = links[0];
832     expandUpperTree(links[0]);
833   }
834 }
835
836 function onHeaderClick(event)
837 {
838   if (document.messageListAjaxRequest) {
839     document.messageListAjaxRequest.aborted = true;
840     document.messageListAjaxRequest.abort();
841   }
842   url = ApplicationBaseURL + currentMailbox + "/" + this.link;
843   if (!this.link.match(/noframe=/))
844     url += "&noframe=1";
845   document.messageListAjaxRequest
846     = triggerAjaxRequest(url, messageListCallback);
847
848   event.preventDefault();
849 }
850
851 function onSearchFormSubmit()
852 {
853   log ("search not implemented");
854
855   return false;
856 }
857
858 function pouetpouet(event) {
859   window.alert("pouet pouet");
860 }
861
862 var mailboxSpanAcceptType = function(type) {
863   return (type == "mailRow");
864 }
865
866 var mailboxSpanEnter = function() {
867   this.addClassName("_dragOver");
868 }
869
870 var mailboxSpanExit = function() {
871   this.removeClassName("_dragOver");
872 }
873
874 var mailboxSpanDrop = function(data) {
875   var success = false;
876
877   if (data) {
878     var folder = this.parentNode.parentNode.getAttribute("dataname");
879     if (folder != currentMailbox)
880       success = (moveMessages(data, folder) == 0);
881   }
882   else
883     success = false;
884
885   return success;
886 }
887
888 var plusSignEnter = function() {
889   var nodeNr = parseInt(this.id.substr(2));
890   if (!d.aNodes[nodeNr]._io)
891     this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000);
892 }
893
894 var plusSignExit = function() {
895   if (this.plusSignTimer) {
896     clearTimeout(this.plusSignTimer);
897     this.plusSignTimer = null;
898   }
899 }
900
901 function openPlusSign(nodeNr) {
902   d.nodeStatus(1, nodeNr, d.aNodes[nodeNr]._ls);
903   d.aNodes[nodeNr]._io = 1;
904   this.plusSignTimer = null;
905 }
906
907 var messageListGhost = function () {
908   var newDiv = document.createElement("div");
909 //   newDiv.style.width = "25px;";
910 //   newDiv.style.height = "25px;";
911   newDiv.style.backgroundColor = "#aae;";
912   newDiv.style.border = "2px solid #a3a;";
913   newDiv.style.padding = "5px;";
914   newDiv.ghostOffsetX = 10;
915   newDiv.ghostOffsetY = 5;
916
917   var imgCode = '<img src="' + ResourcesURL + '/message-mail.png" />';
918
919   var current = this;
920   while (!current.getSelectedRows)
921     current = current.parentNode;
922   var count = current.getSelectedRows().length;
923   var text = imgCode + '<br />' + count + ' messages...';
924   newDiv.innerHTML = text;
925
926   return newDiv;
927 }
928
929 var messageListData = function(type) {
930   var rows = this.parentNode.parentNode.getSelectedRowsId();
931   var msgIds = new Array();
932   for (var i = 0; i < rows.length; i++)
933     msgIds.push(rows[i].substr(4));
934
935   return msgIds;
936 }
937
938 function configureMessageListEvents() {
939   var messageList = $("messageList");
940   if (messageList) {
941     messageList.addEventListener("selectionchange",
942                                  onMessageSelectionChange, false);
943     var rows = messageList.tBodies[0].rows;
944     var start = 0;
945     if (rows.length > 1) {
946       while (rows[start].cells[0].hasClassName("tbtv_headercell")
947              || rows[start].cells[0].hasClassName("tbtv_navcell"))
948         start++;
949       for (var i = start; i < rows.length; i++) {
950         rows[i].addEventListener("mousedown", onRowClick, false);
951         rows[i].addEventListener("contextmenu", onMessageContextMenu, false);
952         
953         rows[i].dndTypes = function() { return new Array("mailRow"); };
954         rows[i].dndGhost = messageListGhost;
955         rows[i].dndDataForType = messageListData;
956         document.DNDManager.registerSource(rows[i]);
957         
958         for (var j = 0; j < rows[i].cells.length; j++) {
959           var cell = rows[i].cells[j];
960           cell.addEventListener("mousedown", listRowMouseDownHandler, false);
961           if (j == 2 || j == 3 || j == 5)
962             cell.addEventListener("dblclick", onMessageDoubleClick, false);
963           else if (j == 4) {
964             var img = cell.childNodesWithTag("img")[0];
965             img.addEventListener("click", mailListMarkMessage, false);
966           }
967         }
968       }
969     }
970   }
971 }
972
973 function configureDragHandles() {
974   var handle = $("verticalDragHandle");
975   if (handle) {
976     handle.addInterface(SOGoDragHandlesInterface);
977     handle.leftBlock=$("leftPanel");
978     handle.rightBlock=$("rightPanel");
979   }
980
981   handle = $("rightDragHandle");
982   if (handle) {
983     handle.addInterface(SOGoDragHandlesInterface);
984     handle.upperBlock=$("mailboxContent");
985     handle.lowerBlock=$("messageContent");
986   }
987 }
988
989 /* dnd */
990 function initDnd() {
991 //   log ("MailerUI initDnd");
992
993   var tree = $("d");
994   if (tree) {
995     var images = tree.getElementsByTagName("img");
996     for (var i = 0; i < images.length; i++) {
997       if (images[i].id[0] == 'j') {
998         images[i].dndAcceptType = mailboxSpanAcceptType;
999         images[i].dndEnter = plusSignEnter;
1000         images[i].dndExit = plusSignExit;
1001         document.DNDManager.registerDestination(images[i]);
1002       }
1003     }
1004     var nodes = document.getElementsByClassName("leaf", tree);
1005     for (var i = 0; i < nodes.length; i++) {
1006       nodes[i].dndAcceptType = mailboxSpanAcceptType;
1007       nodes[i].dndEnter = mailboxSpanEnter;
1008       nodes[i].dndExit = mailboxSpanExit;
1009       nodes[i].dndDrop = mailboxSpanDrop;
1010       document.DNDManager.registerDestination(nodes[i]);
1011     }
1012   }
1013 }
1014
1015 /* stub */
1016
1017 function refreshContacts() {
1018 }
1019
1020 function openInbox(node) {
1021   var done = false;
1022   openMailbox(node.parentNode.getAttribute("dataname"));
1023   var tree = $("d");
1024   tree.selectedEntry = node;
1025   node.select();
1026   var currentNode = node.parentNode.parentNode;
1027   while (!done) {
1028     var number = currentNode.getAttribute("id").substr(2);
1029     d.o(number);
1030     if (number == "1")
1031       done = true;
1032     else
1033       currentNode = currentNode.parentNode;
1034   }
1035 }
1036
1037 var initMailer = {
1038   handleEvent: function (event) {
1039     if (!document.body.hasClassName("popup")) {
1040       var inboxFound = false;
1041       configureMessageListEvents();
1042       initDnd();
1043       var tree = $("d");
1044       var nodes = document.getElementsByClassName("node", tree);
1045       for (i = 0; i < nodes.length; i++) {
1046         nodes[i].addEventListener("click", onMailboxTreeItemClick, false);
1047         nodes[i].addEventListener("contextmenu", onFolderMenuClick, false);
1048         if (!inboxFound
1049             && nodes[i].parentNode.getAttribute("datatype") == "inbox") {
1050           openInbox(nodes[i]);
1051           inboxFound = true;
1052         }
1053       }
1054     }
1055
1056     /*
1057 , 'onMailboxTreeItemClick(this);'
1058 <!--      if (typeof(node.datatype) != "undefined") str += ' oncontextmenu="onFolderMenuClick(event, this);"';
1059
1060     */
1061
1062   }
1063 }
1064
1065 function initializeMenus() {
1066   var menus = new Array("accountIconMenu", "inboxIconMenu", "trashIconMenu",
1067                         "mailboxIconMenu", "addressMenu", "messageListMenu",
1068                         "messageContentMenu", "label-menu", "mailboxes-menu",
1069                         "mark-menu", "searchMenu");
1070   initMenusNamed(menus);
1071 }
1072
1073 window.addEventListener("load", initMailer, false);