]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/ContactsUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1033 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / ContactsUI.js
1 /*
2   Copyright (C) 2005 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
6   OGo is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with OGo; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21 /* JavaScript for SOGo Mailer */
22
23 /*
24   DOM ids available in mail list view:
25     row_$msgid
26     div_$msgid
27     readdiv_$msgid
28     unreaddiv_$msgid
29
30   Window Properties:
31     width, height
32     bool: resizable, scrollbars, toolbar, location, directories, status,
33           menubar, copyhistory
34 */
35
36 var cachedContacts = new Array();
37 var currentContactFolder = '';
38 var currentFolderIsExternal = false;
39 var contactSelectorAction = 'addressbooks-contacts';
40
41 function openContactWindow(sender, url) {
42   var msgWin = window.open(url, null, "width=450,height=600,resizable=0");
43   msgWin.focus();
44 }
45
46 function clickedUid(sender, contactuid) {
47   resetSelection(window);
48   openContactWindow(sender, contactuid,
49                     CurrentContactFolderURL()
50                     + "/" + contactuid + "/edit");
51   return true;
52 }
53
54 function doubleClickedUid(sender, contactuid) {
55   alert("DOUBLE Clicked " + contactuid);
56
57   return false;
58 }
59
60 function toggleMailSelect(sender) {
61   var row;
62   row = $(sender.name);
63   row.className = sender.checked ? "tableview_selected" : "tableview";
64 }
65
66 /* mail editor */
67
68 function validateEditorInput(sender) {
69   var errortext = "";
70   var field;
71   
72   field = document.pageform.subject;
73   if (field.value == "")
74     errortext = errortext + labels.error_missingsubject + "\n";
75
76   if (!UIxRecipientSelectorHasRecipients())
77     errortext = errortext + labels.error_missingrecipients + "\n";
78   
79   if (errortext.length > 0) {
80     alert(labels.error_validationfailed.decodeEntities() + ":\n"
81           + errortext.decodeEntities());
82     return false;
83   }
84   return true;
85 }
86
87 function onContactsFolderTreeItemClick(element) {
88   var topNode = $('d');
89   var contactsFolder = element.parentNode.getAttribute("dataname");
90
91   if (topNode.selectedEntry)
92     topNode.selectedEntry.deselect();
93   element.select();
94   topNode.selectedEntry = element;
95
96   openContactsFolder(contactsFolder);
97 }
98
99 function CurrentContactFolderURL() {
100   return ((currentFolderIsExternal)
101           ? UserFolderURL + "../" + currentContactFolder + "/Contacts/personal"
102           : ApplicationBaseURL + currentContactFolder);
103 }
104
105 function openContactsFolder(contactsFolder, params, external) {
106   if (contactsFolder != currentContactFolder || params) {
107      if (contactsFolder == currentContactFolder) {
108         var contactsList = $("contactsList");
109         if (contactsList)
110            selection = contactsList.getSelectedRowsId();
111         else
112            window.alert("no contactsList");
113      }
114      else
115       selection = null;
116
117     currentContactFolder = contactsFolder;
118     if (external)
119       currentFolderIsExternal = true;
120     else
121       currentFolderIsExternal = false;
122     var url = CurrentContactFolderURL() + "/view?noframe=1&sort=cn&desc=0";
123     if (params)
124       url += '&' + params;
125
126     var selection;
127     if (document.contactsListAjaxRequest) {
128       document.contactsListAjaxRequest.aborted = true;
129       document.contactsListAjaxRequest.abort();
130     }
131     document.contactsListAjaxRequest
132       = triggerAjaxRequest(url, contactsListCallback, selection);
133   }
134 }
135
136 function openContactsFolderAtIndex(element) {
137   var idx = element.getAttribute("idx");
138   var url = CurrentContactFolderURL() + "/view?noframe=1&idx=" + idx;
139
140   if (document.contactsListAjaxRequest) {
141     document.contactsListAjaxRequest.aborted = true;
142     document.contactsListAjaxRequest.abort();
143   }
144   document.contactsListAjaxRequest
145     = triggerAjaxRequest(url, contactsListCallback);
146 }
147
148 function contactsListCallback(http) {
149   var div = $("contactsListContent");
150
151   if (http.readyState == 4
152       && http.status == 200) {
153     document.contactsListAjaxRequest = null;
154     div.innerHTML = http.responseText;
155     var selected = http.callbackData;
156     if (selected) {
157         for (var i = 0; i < selected.length; i++)
158           $(selected[i]).select();
159     }
160     configureSortableTableHeaders();
161   }
162   else
163     log ("ajax fuckage 1");
164 }
165
166 function onContactFoldersContextMenu(event) {
167   var menu = $("contactFoldersMenu");
168   menu.addEventListener("hideMenu", onContactFoldersContextMenuHide, false);
169   onMenuClick(event, "contactFoldersMenu");
170
171   var topNode = $("contactFolders");
172   var selectedNodes = topNode.getSelectedRows();
173   topNode.menuSelectedRows = selectedNodes;
174   for (var i = 0; i < selectedNodes.length; i++)
175     selectedNodes[i].deselect();
176   topNode.menuSelectedEntry = this;
177   this.select();
178 }
179
180 function onContactContextMenu(event, element) {
181   var menu = $("contactMenu");
182   menu.addEventListener("hideMenu", onContactContextMenuHide, false);
183   onMenuClick(event, "contactMenu");
184
185   var topNode = $("contactsList");
186   var selectedNodes = topNode.getSelectedRows();
187   topNode.menuSelectedRows = selectedNodes;
188   for (var i = 0; i < selectedNodes.length; i++)
189     selectedNodes[i].deselect();
190   topNode.menuSelectedEntry = element;
191   element.select();
192 }
193
194 function onContactContextMenuHide(event) {
195   var topNode = $("contactsList");
196
197   if (topNode.menuSelectedEntry) {
198     topNode.menuSelectedEntry.deselect();
199     topNode.menuSelectedEntry = null;
200   }
201   if (topNode.menuSelectedRows) {
202     var nodes = topNode.menuSelectedRows;
203     for (var i = 0; i < nodes.length; i++)
204       nodes[i].select();
205     topNode.menuSelectedRows = null;
206   }
207 }
208
209 function onContactFoldersContextMenuHide(event) {
210   var topNode = $("contactFolders");
211
212   if (topNode.menuSelectedEntry) {
213     topNode.menuSelectedEntry.deselect();
214     topNode.menuSelectedEntry = null;
215   }
216   if (topNode.menuSelectedRows) {
217     var nodes = topNode.menuSelectedRows;
218     for (var i = 0; i < nodes.length; i++)
219       nodes[i].select();
220     topNode.menuSelectedRows = null;
221   }
222 }
223
224 function onFolderMenuHide(event) {
225   var topNode = $('d');
226
227   if (topNode.menuSelectedEntry) {
228     topNode.menuSelectedEntry.deselect();
229     topNode.menuSelectedEntry = null;
230   }
231   if (topNode.selectedEntry)
232     topNode.selectedEntry.select();
233 }
234
235 function loadContact(idx) {
236   if (document.contactAjaxRequest) {
237     document.contactAjaxRequest.aborted = true;
238     document.contactAjaxRequest.abort();
239   }
240
241   if (cachedContacts[currentContactFolder + "/" + idx]) {
242     var div = $('contactView');
243     div.innerHTML = cachedContacts[currentContactFolder + "/" + idx];
244   }
245   else {
246     var url = (CurrentContactFolderURL() + "/"
247                + idx + "/view?noframe=1");
248     document.contactAjaxRequest
249       = triggerAjaxRequest(url, contactLoadCallback, idx);
250   }
251 }
252
253 function contactLoadCallback(http) {
254   var div = $('contactView');
255
256   if (http.readyState == 4
257       && http.status == 200) {
258     document.contactAjaxRequest = null;
259     var content = http.responseText;
260     cachedContacts[currentContactFolder + "/" + http.callbackData] = content;
261     div.innerHTML = content;
262   }
263   else
264     log ("ajax fuckage 2");
265 }
266
267 var rowSelectionCount = 0;
268
269 validateControls();
270
271 function showElement(e, shouldShow) {
272   e.style.display = shouldShow ? "" : "none";
273 }
274
275 function enableElement(e, shouldEnable) {
276   if(!e)
277     return;
278   if(shouldEnable) {
279     if(e.hasAttribute("disabled"))
280       e.removeAttribute("disabled");
281   }
282   else {
283     e.setAttribute("disabled", "1");
284   }
285 }
286
287 function validateControls() {
288   var e = $("moveto");
289   this.enableElement(e, rowSelectionCount > 0);
290 }
291
292 function moveTo(uri) {
293   alert("MoveTo: " + uri);
294 }
295
296 /* contact menu entries */
297 function onContactRowClick(event, node) {
298   loadContact(node.getAttribute('id'));
299
300   return onRowClick(event);
301 }
302
303 function onContactRowDblClick(event, node) {
304   var contactId = node.getAttribute('id');
305
306   openContactWindow(null,
307                     CurrentContactFolderURL()
308                     + "/" + contactId + "/edit");
309
310   return false;
311 }
312
313 function onMenuEditContact(event, node) {
314   var node = getParentMenu(node).menuTarget.parentNode;
315   var contactId = node.getAttribute('id');
316
317   openContactWindow(null,
318                     CurrentContactFolderURL()
319                     + "/" + contactId + "/edit");
320
321   return false;
322 }
323
324 function onMenuWriteToContact(event, node) {
325   var node = getParentMenu(node).menuTarget.parentNode;
326   var contactId = node.getAttribute('id');
327
328   openMailComposeWindow(CurrentContactFolderURL()
329                         + "/" + contactId + "/write");
330
331   return false;
332 }
333
334 function onMenuDeleteContact(event, node) {
335   uixDeleteSelectedContacts(node);
336
337   return false;
338 }
339
340 function onToolbarEditSelectedContacts(event) {
341   var contactsList = $('contactsList');
342   var rows = contactsList.getSelectedRowsId();
343
344   for (var i = 0; i < rows.length; i++) {
345     openContactWindow(null,
346                       CurrentContactFolderURL()
347                       + "/" + rows[i] + "/edit");
348   }
349
350   return false;
351 }
352
353 function onToolbarWriteToSelectedContacts(event) {
354   var contactsList = $('contactsList');
355   var rows = contactsList.getSelectedRowsId();
356
357   for (var i = 0; i < rows.length; i++)
358     openMailComposeWindow(CurrentContactFolderURL()
359                           + "/" + rows[i] + "/write");
360
361   return false;
362 }
363
364 function uixDeleteSelectedContacts(sender) {
365   var failCount = 0;
366   var contactsList = $('contactsList');
367   var rows = contactsList.getSelectedRowsId();
368
369   var contactView = $('contactView');
370   contactView.innerHTML = '';
371
372   for (var i = 0; i < rows.length; i++) {
373     var url, http, rowElem;
374     
375     /* send AJAX request (synchronously) */
376     
377     url = (CurrentContactFolderURL() + "/"
378            + rows[i] + "/delete");
379     http = createHTTPClient();
380     http.open("POST", url, false /* not async */);
381     http.send("");
382     if (http.status != 200) { /* request failed */
383       failCount++;
384       http = null;
385       continue;
386     }
387     http = null;
388
389     /* remove from page */
390
391     /* line-through would be nicer, but hiding is OK too */
392     rowElem = $(rows[i]);
393     rowElem.parentNode.removeChild(rowElem);
394   }
395
396   if (failCount > 0)
397     alert("Could not delete " + failCount + " messages!");
398   
399   return false;
400 }
401
402 function newEmailTo(sender) {
403   var mailto = sanitizeMailTo(sender.parentNode.parentNode.menuTarget.innerHTML);
404
405   if (mailto.length > 0)
406     {
407       w = window.open("compose?mailto=" + mailto,
408                       "SOGo_compose",
409                       "width=680,height=520,resizable=1,scrollbars=1,toolbar=0," +
410                       "location=0,directories=0,status=0,menubar=0,copyhistory=0");
411       w.focus();
412     }
413
414   return false; /* stop following the link */
415 }
416
417 function onHeaderClick(event) {
418   if (document.contactsListAjaxRequest) {
419     document.contactsListAjaxRequest.aborted = true;
420     document.contactsListAjaxRequest.abort();
421   }
422   url = CurrentContactFolderURL() + "/" + this.link;
423   if (!this.link.match(/noframe=/))
424     url += "&noframe=1";
425   document.contactsListAjaxRequest
426     = triggerAjaxRequest(url, contactsListCallback);
427
428   event.preventDefault();
429 }
430
431 function registerDraggableMessageNodes() {
432   log ("can we drag...");
433 }
434
435 function newContact(sender) {
436   openContactWindow(sender,
437                     CurrentContactFolderURL() + "/new");
438
439   return false; /* stop following the link */
440 }
441
442 function onFolderSelectionChange() {
443   var folderList = $("contactFolders");
444   var nodes = folderList.getSelectedNodes();
445   $("contactView").innerHTML = '';
446
447   if (nodes[0].hasClassName("denied")) {
448     var div = $("contactsListContent");
449     div.innerHTML = "";
450   }
451   else {
452     var newFolder;
453     var externalFolder = nodes[0].getAttribute("external-addressbook");
454     if (externalFolder)
455       newFolder = externalFolder;
456     else
457       newFolder = nodes[0].getAttribute("id");
458
459     openContactsFolder(newFolder, null, externalFolder);
460   }
461 }
462
463 function onSearchFormSubmit() {
464   var searchValue = $("searchValue");
465
466   openContactsFolder(currentContactFolder, "search=" + searchValue.value);
467
468   return false;
469 }
470
471 function onConfirmContactSelection(tag) {
472   var folderLi = $(currentContactFolder);
473   var currentContactFolderName = folderLi.innerHTML;
474   var selectorList = null;
475   var initialValues = null;
476
477   if (selector)
478     {
479       var selectorId = selector.getAttribute("id");
480       selectorList = opener.window.document.getElementById('uixselector-'
481                                                            + selectorId
482                                                            + '-uidList');
483       initialValues = selectorList.value;
484     }
485
486   var contactsList = $("contactsList");
487   var rows = contactsList.getSelectedRows();
488   for (i = 0; i < rows.length; i++) {
489     var cid = rows[i].getAttribute("contactid");
490     var cname = '' + rows[i].getAttribute("contactname");
491     var email = '' + rows[i].cells[1].innerHTML;
492     opener.window.addContact(tag, currentContactFolderName + '/' + cname,
493                              cid, cname, email);
494   }
495
496   if (selector && selector.changeNotification
497       && selectorList.value != initialValues)
498     selector.changeNotification("addition");
499
500   return false;
501 }
502
503 function onConfirmAddressBookSelection() {
504   var folderLi = $(currentContactFolder);
505   var currentContactFolderName = folderLi.innerHTML;
506
507   var selector = window.opener.document.getElementById("contactFolders");
508   var initialValues = selector.getAttribute("additional-addressbooks");
509   if (!initialValues)
510     initialValues = "";
511   var newValues = initialValues;
512
513   var contactsList = $("contactsList");
514   var rows = contactsList.getSelectedRows();
515   for (i = 0; i < rows.length; i++) {
516     var cid = rows[i].getAttribute("contactid");
517     var cname = '' + rows[i].getAttribute("contactname");
518     var email = '' + rows[i].cells[1].innerHTML;
519     var re = new RegExp("(^|,)" + cid + "($|,)");
520     if (!re.test(newValues)) {
521       if (newValues.length)
522         newValues += "," + cid;
523       else
524         newValues = cid;
525     }
526   }
527
528   if (newValues != initialValues)
529     window.opener.setTimeout("setAdditionalAddressBooks(\""
530                              + newValues + "\");", 100);
531
532   return false;
533 }
534
535 function setAdditionalAddressBooks(additionalAddressBooks) {
536   var urlstr = (ApplicationBaseURL + "/updateAdditionalAddressBooks?ids="
537                 + additionalAddressBooks);
538   if (document.addressBooksAjaxRequest) {
539     document.addressBooksAjaxRequest.aborted = true;
540     document.addressBooksAjaxRequest.abort();
541   }
542   document.addressBooksAjaxRequest
543     = triggerAjaxRequest(urlstr,
544                          addressBooksCallback, additionalAddressBooks);
545 }
546
547 function addressBooksCallback(http) {
548   if (http.readyState == 4) {
549     if (http.status == 200) {
550       var ul = $("contactFolders");
551
552       var children = ul.childNodesWithTag("li");
553       for (var i = 0; i < children.length; i++)
554         if (children[i].getAttribute("external-addressbook"))
555           ul.removeChild(children[i]);
556
557       ul.setAttribute("additional-addressbooks", http.callbackData);
558       if (http.callbackData.length > 0) {
559         var list = http.callbackData.split(",");
560         var newCode = "";
561         for (var i = 0; i < list.length; i++) {
562           var username = list[i];
563           newCode += ( "<li external-addressbook=\"" + username + "\""
564                        + " onmousedown=\"return false;\""
565                        + " onclick=\"return onRowClick(event);\""
566                        + " oncontextmenu=\"return onContactFolderContextMenu(event);\">" );
567           newCode += ( username + "</li>" );
568         }
569         ul.innerHTML += newCode;
570       }
571     }
572     document.addressBooksAjaxRequest = null;
573   }
574   else
575     log ("ajax fuckage 3");
576 }
577
578 function onContactMailTo(node) {
579   return openMailTo(node.innerHTML);
580 }
581
582 function refreshContacts(contactId) {
583   openContactsFolder(currentContactFolder, "reload=true", currentFolderIsExternal);
584   cachedContacts[currentContactFolder + "/" + contactId] = null;
585   loadContact(contactId);
586
587   return false;
588 }
589
590 function onAddressBookNew(event) {
591   var name = window.prompt(labels["Name of the Address Book"].decodeEntities());
592   if (name) {
593     if (document.newAbAjaxRequest) {
594       document.newAbAjaxRequest.aborted = true;
595       document.newAbAjaxRequest.abort();
596     }
597     var url = ApplicationBaseURL + "/newAb?name=" + name;
598     document.newAbAjaxRequest
599        = triggerAjaxRequest(url, newAbCallback, name);
600   }
601   event.preventDefault();
602 }
603
604 function newAbCallback(http) {
605   if (http.readyState == 4
606       && http.status == 201) {
607      var ul = $("contactFolders");
608      var name = http.callbackData;
609      var li = document.createElement("li");
610      li.setAttribute("id", "/" + name);
611      li.appendChild(document.createTextNode(name));
612      li.addEventListener("mousedown", listRowMouseDownHandler, false);
613      li.addEventListener("click", onRowClick, false);
614      li.addEventListener("contextmenu", onContactFoldersContextMenu, false);
615      ul.appendChild(li);
616   }
617   else
618     log ("ajax fuckage 4:" + http.status);
619 }
620
621 function onAddressBookAdd(event) {
622   var selector = $("contactFolders");
623   var selectorURL = '?popup=YES&selectorId=contactFolders';
624
625   urlstr = ApplicationBaseURL;
626   if (urlstr[urlstr.length-1] != '/')
627     urlstr += '/';
628   urlstr += ("../../" + UserLogin + "/Contacts/"
629              + contactSelectorAction + selectorURL);
630 //   log (urlstr);
631   var w = window.open(urlstr, "Addressbook",
632                       "width=640,height=400,resizable=1,scrollbars=0");
633   w.selector = selector;
634   w.opener = window;
635   w.focus();
636
637   event.preventDefault();
638 }
639
640 function onAddressBookRemove(event) {
641   var selector = $("contactFolders");
642   var nodes = selector.getSelectedNodes();
643   if (nodes.length > 0) {
644     var cid = nodes[0].getAttribute("external-addressbook");
645     if (cid) {
646       var initialValues = selector.getAttribute("additional-addressbooks");
647       var re = new RegExp("(^|,)" + cid + "($|,)");
648       var newValues = initialValues.replace(re, "");
649       if (initialValues != newValues)
650         setAdditionalAddressBooks(newValues);
651     }
652     else {
653        nodes[0].deselect();
654        var folderId = nodes[0].getAttribute("id").substr(1);
655        deletePersonalAddressBook(folderId);
656     }
657
658     var personal = $("/personal");
659     personal.select();
660     onFolderSelectionChange();
661   }
662
663   event.preventDefault();
664 }
665
666 function deletePersonalAddressBook(folderId) {
667    var label
668       = labels["Are you sure you want to delete the selected address book?"];
669    if (window.confirm(label.decodeEntities())) {
670       if (document.deletePersonalABAjaxRequest) {
671          document.deletePersonalABAjaxRequest.aborted = true;
672          document.deletePersonalABAjaxRequest.abort();
673       }
674       var url = ApplicationBaseURL + "/" + folderId + "/delete";
675       document.deletePersonalABAjaxRequest
676          = triggerAjaxRequest(url, deletePersonalAddressBookCallback,
677                               folderId);
678    }
679 }
680
681 function deletePersonalAddressBookCallback(http) {
682   if (http.readyState == 4) {
683      if (http.status == 200) {
684         var ul = $("contactFolders");
685         
686         var children = ul.childNodesWithTag("li");
687         var i = 0;
688         var done = false;
689         while (!done && i < children.length) {
690            var currentFolderId = children[i].getAttribute("id").substr(1);
691            if (currentFolderId == http.callbackData) {
692               ul.removeChild(children[i]);
693               done = true;
694            }
695            else
696               i++;
697         }
698      }
699      document.deletePersonalABAjaxRequest = null;
700   }
701   else
702      log ("ajax fuckage");
703 }
704
705 function configureDragHandles() {
706   var handle = $("dragHandle");
707   if (handle) {
708     handle.addInterface(SOGoDragHandlesInterface);
709     handle.leftBlock=$("contactFoldersList");
710     handle.rightBlock=$("rightPanel");
711   }
712
713   handle = $("rightDragHandle");
714   if (handle) {
715     handle.addInterface(SOGoDragHandlesInterface);
716     handle.upperBlock=$("contactsListContent");
717     handle.lowerBlock=$("contactView");
718   }
719 }
720
721 function lookupDeniedFolders() {
722   var rights;
723   var http = createHTTPClient();
724   if (http) {
725     http.url = ApplicationBaseURL + "/checkRights";
726     http.open("GET", http.url, false /* not async */);
727     http.send("");
728     if (http.status == 200
729         && http.responseText.length > 0) {
730       rights = http.responseText.split(",");
731     }
732   }
733
734   return rights;
735 }
736
737 function configureAbToolbar() {
738   var toolbar = $("abToolbar");
739   var links = toolbar.childNodesWithTag("a");
740   links[0].addEventListener("click", onAddressBookNew, false);
741   links[1].addEventListener("click", onAddressBookAdd, false);
742   links[2].addEventListener("click", onAddressBookRemove, false);
743 }
744
745 function configureContactFolders() {
746   var contactFolders = $("contactFolders");
747   if (contactFolders) {
748     contactFolders.addEventListener("selectionchange",
749                                     onFolderSelectionChange, false);
750     var lis = contactFolders.childNodesWithTag("li");
751     for (var i = 0; i < lis.length; i++) {
752       lis[i].addEventListener("mousedown", listRowMouseDownHandler, false);
753       lis[i].addEventListener("click", onRowClick, false);
754       lis[i].addEventListener("contextmenu", onContactFoldersContextMenu, false);
755     }
756
757     var denieds = lookupDeniedFolders();
758     if (denieds) {
759       var start = (lis.length - denieds.length);
760       for (var i = start; i < lis.length; i++) {
761         if (denieds[i-start] == "1")
762           lis[i].removeClassName("denied");
763         else
764           lis[i].addClassName("denied");
765       }
766     }
767     contactFolders.style.visibility = "visible;";
768   }
769 }
770
771 function onAccessRightsMenuEntryMouseUp(event) {
772   var folders = $("contactFolders");
773   var selected = folders.getSelectedNodes()[0];
774   var external = selected.getAttribute("external-addressbook");
775   var title = this.innerHTML;
776   if (external)
777     url = UserFolderURL + "../" + external + "/Contacts/personal/acls";
778   else
779     url = ApplicationBaseURL + selected.getAttribute("id") + "/acls";
780
781   openAclWindow(url, title);
782 }
783
784 function initializeMenus() {
785   var menus = new Array("contactFoldersMenu", "contactMenu", "searchMenu");
786   initMenusNamed(menus);
787
788   var menuEntry = $("accessRightsMenuEntry");
789   menuEntry.addEventListener("mouseup", onAccessRightsMenuEntryMouseUp, false);
790 }
791
792 var initContacts = {
793   handleEvent: function (event) {
794     if (!document.body.hasClassName("popup")) {
795       configureAbToolbar();
796     }
797     configureContactFolders();
798 //     initDnd();
799   }
800 }
801
802 window.addEventListener("load", initContacts, false);