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