]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/MailerUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1067 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   if (document.messageAjaxRequest) {
611     document.messageAjaxRequest.aborted = true;
612     document.messageAjaxRequest.abort();
613   }
614
615   var cachedMessage = getCachedMessage(idx);
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     configureLinksInMessage();
629   }
630 }
631
632 function configureLinksInMessage() {
633    var messageDiv = $('messageContent');
634    var mailContentDiv = document.getElementsByClassName('mailer_mailcontent',
635                                                         messageDiv)[0];
636    mailContentDiv.addEventListener("contextmenu", onMessageContentMenu, false);
637    var anchors = messageDiv.getElementsByTagName('a');
638    for (var i = 0; i < anchors.length; i++)
639       if (anchors[i].href.substring(0,7) == "mailto:") {
640          anchors[i].addEventListener("click", onEmailAddressClick, false);
641          anchors[i].addEventListener("contextmenu", onEmailAddressClick,
642                                      false);
643       }
644       else
645          anchors[i].addEventListener("click", onMessageAnchorClick, false);
646 }
647
648 function onMessageContentMenu(event) {
649    onMenuClick(event, 'messageContentMenu');
650    event.preventDefault();
651 };
652
653 function onEmailAddressClick(event) {
654    onMenuClick(event, 'addressMenu');
655    event.preventDefault();
656 }
657
658 function onMessageAnchorClick (event) {
659    window.open(this.href);
660    event.preventDefault();
661 }
662
663 function messageCallback(http) {
664   var div = $('messageContent');
665
666   if (http.readyState == 4
667       && http.status == 200) {
668     document.messageAjaxRequest = null;
669     div.innerHTML = http.responseText;
670     configureLinksInMessage();
671
672     if (http.callbackData) {
673       var cachedMessage = new Array();
674       cachedMessage['idx'] = currentMailbox + '/' + http.callbackData;
675       cachedMessage['time'] = (new Date()).getTime();
676       cachedMessage['text'] = http.responseText;
677       if (cachedMessage['text'].length < 30000)
678         storeCachedMessage(cachedMessage);
679     }
680   }
681   else
682     log ("ajax fuckage");
683 }
684
685 function processMailboxMenuAction(mailbox) {
686   var currentNode, upperNode;
687   var mailboxName;
688   var action;
689
690   mailboxName = mailbox.getAttribute('mailboxname');
691   currentNode = mailbox;
692   upperNode = null;
693
694   while (currentNode
695          && !currentNode.hasAttribute('mailboxaction'))
696     currentNode = currentNode.parentNode.parentNode.parentMenuItem;
697
698   if (currentNode)
699     {
700       action = currentNode.getAttribute('mailboxaction');
701 //       var rows  = collectSelectedRows();
702 //       var rString = rows.join(', ');
703 //       alert("performing '" + action + "' on " + rString
704 //             + " to " + mailboxName);
705     }
706 }
707
708 var rowSelectionCount = 0;
709
710 validateControls();
711
712 function showElement(e, shouldShow) {
713   e.style.display = shouldShow ? "" : "none";
714 }
715
716 function enableElement(e, shouldEnable) {
717   if(!e)
718     return;
719   if(shouldEnable) {
720     if(e.hasAttribute("disabled"))
721       e.removeAttribute("disabled");
722   }
723   else {
724     e.setAttribute("disabled", "1");
725   }
726 }
727
728 function validateControls() {
729   var e = $("moveto");
730   this.enableElement(e, rowSelectionCount > 0);
731 }
732
733 function moveTo(uri) {
734   alert("MoveTo: " + uri);
735 }
736
737 function deleteSelectedMails() {
738 }
739
740 /* message menu entries */
741 function onMenuOpenMessage(event) {
742    return openMessageWindowsForSelection('popupview');
743 }
744
745 function onMenuReplyToSender(event) {
746    return openMessageWindowsForSelection('reply');
747 }
748
749 function onMenuReplyToAll(event) {
750    return openMessageWindowsForSelection('replyall');
751 }
752
753 function onMenuForwardMessage(event) {
754    return openMessageWindowsForSelection('forward');
755 }
756
757 /* contacts */
758 function newContactFromEmail(sender) {
759   var mailto = sender.parentNode.parentNode.menuTarget.innerHTML;
760
761 //   var emailre
762 //     = /([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;
763 //   emailre.exec(mailto);
764 //   email = RegExp.$1;
765
766 //   var namere = /(\w[\w\ _-]+)\ (&lt;|<)/;
767 //   var c_name = '';
768 //   if (namere.test(mailto)) {
769 //     namere.exec(mailto);
770 //     c_name += RegExp.$1;
771 //   }
772
773   var email = extractEmailAddress(mailto);
774   var c_name = extractEmailName(mailto);
775   if (email.length > 0)
776     {
777       var url = UserFolderURL + "Contacts/new?contactEmail=" + email;
778       if (c_name)
779         url += "&contactFN=" + c_name;
780       w = window.open(url, null,
781                       "width=546,height=490,resizable=1,scrollbars=1,toolbar=0,"
782                       + "location=0,directories=0,status=0,menubar=0,copyhistory=0");
783       w.focus();
784     }
785
786   return false; /* stop following the link */
787 }
788
789 function newEmailTo(sender) {
790   return openMailTo(sender.parentNode.parentNode.menuTarget.innerHTML);
791 }
792
793 function expandUpperTree(node) {
794   var currentNode = node.parentNode;
795
796   while (currentNode.className != "dtree") {
797       if (currentNode.className == 'clip') {
798          var id = currentNode.getAttribute("id");
799          var number = parseInt(id.substr(2));
800          if (number > 0) {
801             var cn = d.aNodes[number];
802             d.nodeStatus(1, number, cn._ls);
803          }
804       }
805       currentNode = currentNode.parentNode;
806   }
807 }
808
809 function initMailboxSelection(mailboxName) {
810   currentMailbox = mailboxName;
811 //   log("initMailboxSelection: " + mailboxName);
812   var tree = $("d");
813   var treeNodes = document.getElementsByClassName("dTreeNode", tree);
814   var i = 0;
815   while (i < treeNodes.length
816          && treeNodes[i].getAttribute("dataname") != currentMailbox)
817     i++;
818   if (i < treeNodes.length) {
819 //     log ("found mailbox");
820     var links = document.getElementsByClassName("node", treeNodes[i]);
821     if (tree.selectedEntry)
822       tree.selectedEntry.deselect();
823     links[0].select();
824     tree.selectedEntry = links[0];
825     expandUpperTree(links[0]);
826   }
827 }
828
829 function onHeaderClick(event) {
830   if (document.messageListAjaxRequest) {
831     document.messageListAjaxRequest.aborted = true;
832     document.messageListAjaxRequest.abort();
833   }
834   url = ApplicationBaseURL + currentMailbox + "/" + this.link;
835   if (!this.link.match(/noframe=/))
836     url += "&noframe=1";
837   document.messageListAjaxRequest
838     = triggerAjaxRequest(url, messageListCallback);
839
840   event.preventDefault();
841 }
842
843 function onSearchFormSubmit() {
844   log ("search not implemented");
845
846   return false;
847 }
848
849 function pouetpouet(event) {
850   window.alert("pouet pouet");
851 }
852
853 var mailboxSpanAcceptType = function(type) {
854   return (type == "mailRow");
855 }
856
857 var mailboxSpanEnter = function() {
858   this.addClassName("_dragOver");
859 }
860
861 var mailboxSpanExit = function() {
862   this.removeClassName("_dragOver");
863 }
864
865 var mailboxSpanDrop = function(data) {
866   var success = false;
867
868   if (data) {
869     var folder = this.parentNode.parentNode.getAttribute("dataname");
870     if (folder != currentMailbox)
871       success = (moveMessages(data, folder) == 0);
872   }
873   else
874     success = false;
875
876   return success;
877 }
878
879 var plusSignEnter = function() {
880   var nodeNr = parseInt(this.id.substr(2));
881   if (!d.aNodes[nodeNr]._io)
882     this.plusSignTimer = setTimeout("openPlusSign('" + nodeNr + "');", 1000);
883 }
884
885 var plusSignExit = function() {
886   if (this.plusSignTimer) {
887     clearTimeout(this.plusSignTimer);
888     this.plusSignTimer = null;
889   }
890 }
891
892 function openPlusSign(nodeNr) {
893   d.nodeStatus(1, nodeNr, d.aNodes[nodeNr]._ls);
894   d.aNodes[nodeNr]._io = 1;
895   this.plusSignTimer = null;
896 }
897
898 var messageListGhost = function () {
899   var newDiv = document.createElement("div");
900 //   newDiv.style.width = "25px;";
901 //   newDiv.style.height = "25px;";
902   newDiv.style.backgroundColor = "#aae;";
903   newDiv.style.border = "2px solid #a3a;";
904   newDiv.style.padding = "5px;";
905   newDiv.ghostOffsetX = 10;
906   newDiv.ghostOffsetY = 5;
907
908   var imgCode = '<img src="' + ResourcesURL + '/message-mail.png" />';
909
910   var current = this;
911   while (!current.getSelectedRows)
912     current = current.parentNode;
913   var count = current.getSelectedRows().length;
914   var text = imgCode + '<br />' + count + ' messages...';
915   newDiv.innerHTML = text;
916
917   return newDiv;
918 }
919
920 var messageListData = function(type) {
921   var rows = this.parentNode.parentNode.getSelectedRowsId();
922   var msgIds = new Array();
923   for (var i = 0; i < rows.length; i++)
924     msgIds.push(rows[i].substr(4));
925
926   return msgIds;
927 }
928
929 function configureMessageListEvents() {
930   var messageList = $("messageList");
931   if (messageList) {
932     messageList.addEventListener("selectionchange",
933                                  onMessageSelectionChange, false);
934     var rows = messageList.tBodies[0].rows;
935     var start = 0;
936     if (rows.length > 1) {
937       while (rows[start].cells[0].hasClassName("tbtv_headercell")
938              || rows[start].cells[0].hasClassName("tbtv_navcell"))
939         start++;
940       for (var i = start; i < rows.length; i++) {
941         rows[i].addEventListener("mousedown", onRowClick, false);
942         rows[i].addEventListener("contextmenu", onMessageContextMenu, false);
943         
944         rows[i].dndTypes = function() { return new Array("mailRow"); };
945         rows[i].dndGhost = messageListGhost;
946         rows[i].dndDataForType = messageListData;
947         document.DNDManager.registerSource(rows[i]);
948         
949         for (var j = 0; j < rows[i].cells.length; j++) {
950           var cell = rows[i].cells[j];
951           cell.addEventListener("mousedown", listRowMouseDownHandler, false);
952           if (j == 2 || j == 3 || j == 5)
953             cell.addEventListener("dblclick", onMessageDoubleClick, false);
954           else if (j == 4) {
955             var img = cell.childNodesWithTag("img")[0];
956             img.addEventListener("click", mailListMarkMessage, false);
957           }
958         }
959       }
960     }
961   }
962 }
963
964 function configureDragHandles() {
965   var handle = $("verticalDragHandle");
966   if (handle) {
967     handle.addInterface(SOGoDragHandlesInterface);
968     handle.leftBlock=$("leftPanel");
969     handle.rightBlock=$("rightPanel");
970   }
971
972   handle = $("rightDragHandle");
973   if (handle) {
974     handle.addInterface(SOGoDragHandlesInterface);
975     handle.upperBlock=$("mailboxContent");
976     handle.lowerBlock=$("messageContent");
977   }
978 }
979
980 /* dnd */
981 function initDnd() {
982 //   log ("MailerUI initDnd");
983
984   var tree = $("d");
985   if (tree) {
986     var images = tree.getElementsByTagName("img");
987     for (var i = 0; i < images.length; i++) {
988       if (images[i].id[0] == 'j') {
989         images[i].dndAcceptType = mailboxSpanAcceptType;
990         images[i].dndEnter = plusSignEnter;
991         images[i].dndExit = plusSignExit;
992         document.DNDManager.registerDestination(images[i]);
993       }
994     }
995     var nodes = document.getElementsByClassName("nodeName", tree);
996     for (var i = 0; i < nodes.length; i++) {
997       nodes[i].dndAcceptType = mailboxSpanAcceptType;
998       nodes[i].dndEnter = mailboxSpanEnter;
999       nodes[i].dndExit = mailboxSpanExit;
1000       nodes[i].dndDrop = mailboxSpanDrop;
1001       document.DNDManager.registerDestination(nodes[i]);
1002     }
1003   }
1004 }
1005
1006 /* stub */
1007
1008 function refreshContacts() {
1009 }
1010
1011 function openInbox(node) {
1012   var done = false;
1013   openMailbox(node.parentNode.getAttribute("dataname"));
1014   var tree = $("d");
1015   tree.selectedEntry = node;
1016   node.select();
1017   var currentNode = node.parentNode.parentNode;
1018   while (!done) {
1019     var number = currentNode.getAttribute("id").substr(2);
1020     d.o(number);
1021     if (number == "1")
1022       done = true;
1023     else
1024       currentNode = currentNode.parentNode;
1025   }
1026 }
1027
1028 function configureSearchField() {
1029    var searchValue = $("searchValue");
1030
1031    searchValue.addEventListener("mousedown", onSearchMouseDown, false);
1032    searchValue.addEventListener("click", popupSearchMenu, false);
1033    searchValue.addEventListener("blur", onSearchBlur, false);
1034    searchValue.addEventListener("focus", onSearchFocus, false);
1035    searchValue.addEventListener("keydown", onSearchKeyDown, false);
1036 }
1037
1038 var initMailer = {
1039    handleEvent: function (event) {
1040       if (!document.body.hasClassName("popup")) {
1041          configureSearchField();
1042          var inboxFound = false;
1043          configureMessageListEvents();
1044          initDnd();
1045          var tree = $("d");
1046          var nodes = document.getElementsByClassName("node", tree);
1047          for (i = 0; i < nodes.length; i++) {
1048             nodes[i].addEventListener("click", onMailboxTreeItemClick, false);
1049             nodes[i].addEventListener("contextmenu", onFolderMenuClick, false);
1050             if (!inboxFound
1051                 && nodes[i].parentNode.getAttribute("datatype") == "inbox") {
1052                openInbox(nodes[i]);
1053                inboxFound = true;
1054             }
1055          }
1056       }
1057       
1058       /*
1059       , 'onMailboxTreeItemClick(this);'
1060       <!--      if (typeof(node.datatype) != "undefined") str += ' oncontextmenu="onFolderMenuClick(event, this);"';
1061       
1062       */
1063    }
1064 }
1065
1066 function initializeMenus() {
1067   var menus = new Array("accountIconMenu", "inboxIconMenu", "trashIconMenu",
1068                         "mailboxIconMenu", "addressMenu", "messageListMenu",
1069                         "messageContentMenu", "label-menu", "mailboxes-menu",
1070                         "mark-menu", "searchMenu");
1071   initMenusNamed(menus);
1072 }
1073
1074 window.addEventListener("load", initMailer, false);