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