2 Copyright (C) 2005 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
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
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.
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
21 /* JavaScript for SOGo Mailer */
24 DOM ids available in mail list view:
32 bool: resizable, scrollbars, toolbar, location, directories, status,
36 var cachedContacts = new Array();
37 var currentContactFolder = '';
38 var currentFolderIsExternal = false;
39 var contactSelectorAction = 'addressbooks-contacts';
41 function openContactWindow(sender, url) {
42 var msgWin = window.open(url, null, "width=450,height=600,resizable=0");
46 function clickedUid(sender, contactuid) {
47 resetSelection(window);
48 openContactWindow(sender, contactuid,
49 CurrentContactFolderURL()
50 + "/" + contactuid + "/edit");
54 function doubleClickedUid(sender, contactuid) {
55 alert("DOUBLE Clicked " + contactuid);
60 function toggleMailSelect(sender) {
63 row.className = sender.checked ? "tableview_selected" : "tableview";
68 function validateEditorInput(sender) {
72 field = document.pageform.subject;
73 if (field.value == "")
74 errortext = errortext + labels.error_missingsubject + "\n";
76 if (!UIxRecipientSelectorHasRecipients())
77 errortext = errortext + labels.error_missingrecipients + "\n";
79 if (errortext.length > 0) {
80 alert(labels.error_validationfailed.decodeEntities() + ":\n"
81 + errortext.decodeEntities());
87 function onContactsFolderTreeItemClick(element) {
89 var contactsFolder = element.parentNode.getAttribute("dataname");
91 if (topNode.selectedEntry)
92 topNode.selectedEntry.deselect();
94 topNode.selectedEntry = element;
96 openContactsFolder(contactsFolder);
99 function CurrentContactFolderURL() {
100 return ((currentFolderIsExternal)
101 ? UserFolderURL + "../" + currentContactFolder + "/Contacts/personal"
102 : ApplicationBaseURL + currentContactFolder);
105 function openContactsFolder(contactsFolder, params, external) {
106 if (contactsFolder != currentContactFolder || params) {
107 if (contactsFolder == currentContactFolder) {
108 var contactsList = $("contactsList");
110 selection = contactsList.getSelectedRowsId();
112 window.alert("no contactsList");
117 currentContactFolder = contactsFolder;
119 currentFolderIsExternal = true;
121 currentFolderIsExternal = false;
122 var url = CurrentContactFolderURL() + "/view?noframe=1&sort=cn&desc=0";
127 if (document.contactsListAjaxRequest) {
128 document.contactsListAjaxRequest.aborted = true;
129 document.contactsListAjaxRequest.abort();
131 document.contactsListAjaxRequest
132 = triggerAjaxRequest(url, contactsListCallback, selection);
136 function openContactsFolderAtIndex(element) {
137 var idx = element.getAttribute("idx");
138 var url = CurrentContactFolderURL() + "/view?noframe=1&idx=" + idx;
140 if (document.contactsListAjaxRequest) {
141 document.contactsListAjaxRequest.aborted = true;
142 document.contactsListAjaxRequest.abort();
144 document.contactsListAjaxRequest
145 = triggerAjaxRequest(url, contactsListCallback);
148 function contactsListCallback(http) {
149 var div = $("contactsListContent");
151 if (http.readyState == 4
152 && http.status == 200) {
153 document.contactsListAjaxRequest = null;
154 div.innerHTML = http.responseText;
155 var selected = http.callbackData;
157 for (var i = 0; i < selected.length; i++)
158 $(selected[i]).select();
160 configureSortableTableHeaders();
163 log ("ajax fuckage 1");
166 function onContactFoldersContextMenu(event) {
167 var menu = $("contactFoldersMenu");
168 menu.addEventListener("hideMenu", onContactFoldersContextMenuHide, false);
169 onMenuClick(event, "contactFoldersMenu");
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;
180 function onContactContextMenu(event, element) {
181 var menu = $("contactMenu");
182 menu.addEventListener("hideMenu", onContactContextMenuHide, false);
183 onMenuClick(event, "contactMenu");
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;
194 function onContactContextMenuHide(event) {
195 var topNode = $("contactsList");
197 if (topNode.menuSelectedEntry) {
198 topNode.menuSelectedEntry.deselect();
199 topNode.menuSelectedEntry = null;
201 if (topNode.menuSelectedRows) {
202 var nodes = topNode.menuSelectedRows;
203 for (var i = 0; i < nodes.length; i++)
205 topNode.menuSelectedRows = null;
209 function onContactFoldersContextMenuHide(event) {
210 var topNode = $("contactFolders");
212 if (topNode.menuSelectedEntry) {
213 topNode.menuSelectedEntry.deselect();
214 topNode.menuSelectedEntry = null;
216 if (topNode.menuSelectedRows) {
217 var nodes = topNode.menuSelectedRows;
218 for (var i = 0; i < nodes.length; i++)
220 topNode.menuSelectedRows = null;
224 function onFolderMenuHide(event) {
225 var topNode = $('d');
227 if (topNode.menuSelectedEntry) {
228 topNode.menuSelectedEntry.deselect();
229 topNode.menuSelectedEntry = null;
231 if (topNode.selectedEntry)
232 topNode.selectedEntry.select();
235 function loadContact(idx) {
236 if (document.contactAjaxRequest) {
237 document.contactAjaxRequest.aborted = true;
238 document.contactAjaxRequest.abort();
241 if (cachedContacts[currentContactFolder + "/" + idx]) {
242 var div = $('contactView');
243 div.innerHTML = cachedContacts[currentContactFolder + "/" + idx];
246 var url = (CurrentContactFolderURL() + "/"
247 + idx + "/view?noframe=1");
248 document.contactAjaxRequest
249 = triggerAjaxRequest(url, contactLoadCallback, idx);
253 function contactLoadCallback(http) {
254 var div = $('contactView');
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;
264 log ("ajax fuckage 2");
267 var rowSelectionCount = 0;
271 function showElement(e, shouldShow) {
272 e.style.display = shouldShow ? "" : "none";
275 function enableElement(e, shouldEnable) {
279 if(e.hasAttribute("disabled"))
280 e.removeAttribute("disabled");
283 e.setAttribute("disabled", "1");
287 function validateControls() {
289 this.enableElement(e, rowSelectionCount > 0);
292 function moveTo(uri) {
293 alert("MoveTo: " + uri);
296 /* contact menu entries */
297 function onContactRowClick(event, node) {
298 loadContact(node.getAttribute('id'));
300 return onRowClick(event);
303 function onContactRowDblClick(event, node) {
304 var contactId = node.getAttribute('id');
306 openContactWindow(null,
307 CurrentContactFolderURL()
308 + "/" + contactId + "/edit");
313 function onMenuEditContact(event, node) {
314 var node = getParentMenu(node).menuTarget.parentNode;
315 var contactId = node.getAttribute('id');
317 openContactWindow(null,
318 CurrentContactFolderURL()
319 + "/" + contactId + "/edit");
324 function onMenuWriteToContact(event, node) {
325 var node = getParentMenu(node).menuTarget.parentNode;
326 var contactId = node.getAttribute('id');
328 openMailComposeWindow(CurrentContactFolderURL()
329 + "/" + contactId + "/write");
334 function onMenuDeleteContact(event, node) {
335 uixDeleteSelectedContacts(node);
340 function onToolbarEditSelectedContacts(event) {
341 var contactsList = $('contactsList');
342 var rows = contactsList.getSelectedRowsId();
344 for (var i = 0; i < rows.length; i++) {
345 openContactWindow(null,
346 CurrentContactFolderURL()
347 + "/" + rows[i] + "/edit");
353 function onToolbarWriteToSelectedContacts(event) {
354 var contactsList = $('contactsList');
355 var rows = contactsList.getSelectedRowsId();
357 for (var i = 0; i < rows.length; i++)
358 openMailComposeWindow(CurrentContactFolderURL()
359 + "/" + rows[i] + "/write");
364 function uixDeleteSelectedContacts(sender) {
366 var contactsList = $('contactsList');
367 var rows = contactsList.getSelectedRowsId();
369 var contactView = $('contactView');
370 contactView.innerHTML = '';
372 for (var i = 0; i < rows.length; i++) {
373 var url, http, rowElem;
375 /* send AJAX request (synchronously) */
377 url = (CurrentContactFolderURL() + "/"
378 + rows[i] + "/delete");
379 http = createHTTPClient();
380 http.open("POST", url, false /* not async */);
382 if (http.status != 200) { /* request failed */
389 /* remove from page */
391 /* line-through would be nicer, but hiding is OK too */
392 rowElem = $(rows[i]);
393 rowElem.parentNode.removeChild(rowElem);
397 alert("Could not delete " + failCount + " messages!");
402 function newEmailTo(sender) {
403 var mailto = sanitizeMailTo(sender.parentNode.parentNode.menuTarget.innerHTML);
405 if (mailto.length > 0)
407 w = window.open("compose?mailto=" + mailto,
409 "width=680,height=520,resizable=1,scrollbars=1,toolbar=0," +
410 "location=0,directories=0,status=0,menubar=0,copyhistory=0");
414 return false; /* stop following the link */
417 function onHeaderClick(event) {
418 if (document.contactsListAjaxRequest) {
419 document.contactsListAjaxRequest.aborted = true;
420 document.contactsListAjaxRequest.abort();
422 url = CurrentContactFolderURL() + "/" + this.link;
423 if (!this.link.match(/noframe=/))
425 document.contactsListAjaxRequest
426 = triggerAjaxRequest(url, contactsListCallback);
428 event.preventDefault();
431 function registerDraggableMessageNodes() {
432 log ("can we drag...");
435 function newContact(sender) {
436 openContactWindow(sender,
437 CurrentContactFolderURL() + "/new");
439 return false; /* stop following the link */
442 function onFolderSelectionChange() {
443 var folderList = $("contactFolders");
444 var nodes = folderList.getSelectedNodes();
445 $("contactView").innerHTML = '';
447 if (nodes[0].hasClassName("denied")) {
448 var div = $("contactsListContent");
453 var externalFolder = nodes[0].getAttribute("external-addressbook");
455 newFolder = externalFolder;
457 newFolder = nodes[0].getAttribute("id");
459 openContactsFolder(newFolder, null, externalFolder);
463 function onSearchFormSubmit() {
464 var searchValue = $("searchValue");
466 openContactsFolder(currentContactFolder, "search=" + searchValue.value);
471 function onConfirmContactSelection(tag) {
472 var folderLi = $(currentContactFolder);
473 var currentContactFolderName = folderLi.innerHTML;
474 var selectorList = null;
475 var initialValues = null;
479 var selectorId = selector.getAttribute("id");
480 selectorList = opener.window.document.getElementById('uixselector-'
483 initialValues = selectorList.value;
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,
496 if (selector && selector.changeNotification
497 && selectorList.value != initialValues)
498 selector.changeNotification("addition");
503 function onConfirmAddressBookSelection() {
504 var folderLi = $(currentContactFolder);
505 var currentContactFolderName = folderLi.innerHTML;
507 var selector = window.opener.document.getElementById("contactFolders");
508 var initialValues = selector.getAttribute("additional-addressbooks");
511 var newValues = initialValues;
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;
528 if (newValues != initialValues)
529 window.opener.setTimeout("setAdditionalAddressBooks(\""
530 + newValues + "\");", 100);
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();
542 document.addressBooksAjaxRequest
543 = triggerAjaxRequest(urlstr,
544 addressBooksCallback, additionalAddressBooks);
547 function addressBooksCallback(http) {
548 if (http.readyState == 4) {
549 if (http.status == 200) {
550 var ul = $("contactFolders");
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]);
557 ul.setAttribute("additional-addressbooks", http.callbackData);
558 if (http.callbackData.length > 0) {
559 var list = http.callbackData.split(",");
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>" );
569 ul.innerHTML += newCode;
572 document.addressBooksAjaxRequest = null;
575 log ("ajax fuckage 3");
578 function onContactMailTo(node) {
579 return openMailTo(node.innerHTML);
582 function refreshContacts(contactId) {
583 openContactsFolder(currentContactFolder, "reload=true", currentFolderIsExternal);
584 cachedContacts[currentContactFolder + "/" + contactId] = null;
585 loadContact(contactId);
590 function onAddressBookNew(event) {
591 var name = window.prompt(labels["Name of the Address Book"].decodeEntities());
593 if (document.newAbAjaxRequest) {
594 document.newAbAjaxRequest.aborted = true;
595 document.newAbAjaxRequest.abort();
597 var url = ApplicationBaseURL + "/newAb?name=" + name;
598 document.newAbAjaxRequest
599 = triggerAjaxRequest(url, newAbCallback, name);
601 event.preventDefault();
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);
618 log ("ajax fuckage 4:" + http.status);
621 function onAddressBookAdd(event) {
622 var selector = $("contactFolders");
623 var selectorURL = '?popup=YES&selectorId=contactFolders';
625 urlstr = ApplicationBaseURL;
626 if (urlstr[urlstr.length-1] != '/')
628 urlstr += ("../../" + UserLogin + "/Contacts/"
629 + contactSelectorAction + selectorURL);
631 var w = window.open(urlstr, "Addressbook",
632 "width=640,height=400,resizable=1,scrollbars=0");
633 w.selector = selector;
637 event.preventDefault();
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");
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);
654 var folderId = nodes[0].getAttribute("id").substr(1);
655 deletePersonalAddressBook(folderId);
658 var personal = $("/personal");
660 onFolderSelectionChange();
663 event.preventDefault();
666 function deletePersonalAddressBook(folderId) {
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();
674 var url = ApplicationBaseURL + "/" + folderId + "/delete";
675 document.deletePersonalABAjaxRequest
676 = triggerAjaxRequest(url, deletePersonalAddressBookCallback,
681 function deletePersonalAddressBookCallback(http) {
682 if (http.readyState == 4) {
683 if (http.status == 200) {
684 var ul = $("contactFolders");
686 var children = ul.childNodesWithTag("li");
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]);
699 document.deletePersonalABAjaxRequest = null;
702 log ("ajax fuckage");
705 function configureDragHandles() {
706 var handle = $("dragHandle");
708 handle.addInterface(SOGoDragHandlesInterface);
709 handle.leftBlock=$("contactFoldersList");
710 handle.rightBlock=$("rightPanel");
713 handle = $("rightDragHandle");
715 handle.addInterface(SOGoDragHandlesInterface);
716 handle.upperBlock=$("contactsListContent");
717 handle.lowerBlock=$("contactView");
721 function lookupDeniedFolders() {
723 var http = createHTTPClient();
725 http.url = ApplicationBaseURL + "/checkRights";
726 http.open("GET", http.url, false /* not async */);
728 if (http.status == 200
729 && http.responseText.length > 0) {
730 rights = http.responseText.split(",");
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);
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);
757 var denieds = lookupDeniedFolders();
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");
764 lis[i].addClassName("denied");
767 contactFolders.style.visibility = "visible;";
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;
777 url = UserFolderURL + "../" + external + "/Contacts/personal/acls";
779 url = ApplicationBaseURL + selected.getAttribute("id") + "/acls";
781 openAclWindow(url, title);
784 function initializeMenus() {
785 var menus = new Array("contactFoldersMenu", "contactMenu", "searchMenu");
786 initMenusNamed(menus);
788 var menuEntry = $("accessRightsMenuEntry");
789 menuEntry.addEventListener("mouseup", onAccessRightsMenuEntryMouseUp, false);
793 handleEvent: function (event) {
794 if (!document.body.hasClassName("popup")) {
795 configureAbToolbar();
797 configureContactFolders();
802 window.addEventListener("load", initContacts, false);