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