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