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=545,height=545,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)
90 var contactsFolder = element.parentNode.getAttribute("dataname");
92 if (topNode.selectedEntry)
93 topNode.selectedEntry.deselect();
95 topNode.selectedEntry = element;
97 openContactsFolder(contactsFolder);
100 function CurrentContactFolderURL() {
101 return ((currentFolderIsExternal)
102 ? UserFolderURL + "../" + currentContactFolder + "/Contacts/personal"
103 : ApplicationBaseURL + currentContactFolder);
106 function openContactsFolder(contactsFolder, params, external)
108 if (contactsFolder != currentContactFolder || params) {
109 if (contactsFolder == currentContactFolder)
110 selection = $("contactsList").getSelectedRowsId();
114 currentContactFolder = contactsFolder;
116 currentFolderIsExternal = true;
118 currentFolderIsExternal = false;
119 var url = CurrentContactFolderURL() + "/view?noframe=1&sort=cn&desc=0";
124 if (document.contactsListAjaxRequest) {
125 document.contactsListAjaxRequest.aborted = true;
126 document.contactsListAjaxRequest.abort();
128 document.contactsListAjaxRequest
129 = triggerAjaxRequest(url, contactsListCallback, selection);
133 function openContactsFolderAtIndex(element) {
134 var idx = element.getAttribute("idx");
135 var url = CurrentContactFolderURL() + "/view?noframe=1&idx=" + idx;
137 if (document.contactsListAjaxRequest) {
138 document.contactsListAjaxRequest.aborted = true;
139 document.contactsListAjaxRequest.abort();
141 document.contactsListAjaxRequest
142 = triggerAjaxRequest(url, contactsListCallback);
145 function contactsListCallback(http)
147 var div = $("contactsListContent");
149 if (http.readyState == 4
150 && http.status == 200) {
151 document.contactsListAjaxRequest = null;
152 div.innerHTML = http.responseText;
153 var selected = http.callbackData;
155 for (var i = 0; i < selected.length; i++)
156 $(selected[i]).select();
158 configureSortableTableHeaders();
161 log ("ajax fuckage");
164 function onContactFoldersContextMenu(event)
166 var menu = $("contactFoldersMenu");
167 menu.addEventListener("hideMenu", onContactFoldersContextMenuHide, false);
168 onMenuClick(event, "contactFoldersMenu");
170 var topNode = $("contactFolders");
171 var selectedNodes = topNode.getSelectedRows();
172 topNode.menuSelectedRows = selectedNodes;
173 for (var i = 0; i < selectedNodes.length; i++)
174 selectedNodes[i].deselect();
175 topNode.menuSelectedEntry = this;
179 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)
196 var topNode = $("contactsList");
198 if (topNode.menuSelectedEntry) {
199 topNode.menuSelectedEntry.deselect();
200 topNode.menuSelectedEntry = null;
202 if (topNode.menuSelectedRows) {
203 var nodes = topNode.menuSelectedRows;
204 for (var i = 0; i < nodes.length; i++)
206 topNode.menuSelectedRows = null;
210 function onContactFoldersContextMenuHide(event)
212 var topNode = $("contactFolders");
214 if (topNode.menuSelectedEntry) {
215 topNode.menuSelectedEntry.deselect();
216 topNode.menuSelectedEntry = null;
218 if (topNode.menuSelectedRows) {
219 var nodes = topNode.menuSelectedRows;
220 for (var i = 0; i < nodes.length; i++)
222 topNode.menuSelectedRows = null;
226 function onFolderMenuHide(event)
228 var topNode = $('d');
230 if (topNode.menuSelectedEntry) {
231 topNode.menuSelectedEntry.deselect();
232 topNode.menuSelectedEntry = null;
234 if (topNode.selectedEntry)
235 topNode.selectedEntry.select();
238 function loadContact(idx)
240 if (document.contactAjaxRequest) {
241 document.contactAjaxRequest.aborted = true;
242 document.contactAjaxRequest.abort();
245 if (cachedContacts[currentContactFolder + "/" + idx]) {
246 var div = $('contactView');
247 div.innerHTML = cachedContacts[currentContactFolder + "/" + idx];
250 var url = (CurrentContactFolderURL() + "/"
251 + idx + "/view?noframe=1");
252 document.contactAjaxRequest
253 = triggerAjaxRequest(url, contactLoadCallback, idx);
257 function contactLoadCallback(http)
259 var div = $('contactView');
261 if (http.readyState == 4
262 && http.status == 200) {
263 document.contactAjaxRequest = null;
264 var content = http.responseText;
265 cachedContacts[currentContactFolder + "/" + http.callbackData] = content;
266 div.innerHTML = content;
269 log ("ajax fuckage");
272 var rowSelectionCount = 0;
276 function showElement(e, shouldShow) {
277 e.style.display = shouldShow ? "" : "none";
280 function enableElement(e, shouldEnable) {
284 if(e.hasAttribute("disabled"))
285 e.removeAttribute("disabled");
288 e.setAttribute("disabled", "1");
292 function validateControls() {
294 this.enableElement(e, rowSelectionCount > 0);
297 function moveTo(uri) {
298 alert("MoveTo: " + uri);
301 /* contact menu entries */
302 function onContactRowClick(event, node)
304 loadContact(node.getAttribute('id'));
306 return onRowClick(event);
309 function onContactRowDblClick(event, node)
311 var contactId = node.getAttribute('id');
313 openContactWindow(null,
314 CurrentContactFolderURL()
315 + "/" + contactId + "/edit");
320 function onMenuEditContact(event, node)
322 var node = getParentMenu(node).menuTarget.parentNode;
323 var contactId = node.getAttribute('id');
325 openContactWindow(null,
326 CurrentContactFolderURL()
327 + "/" + contactId + "/edit");
332 function onMenuWriteToContact(event, node)
334 var node = getParentMenu(node).menuTarget.parentNode;
335 var contactId = node.getAttribute('id');
337 openMailComposeWindow(CurrentContactFolderURL()
338 + "/" + contactId + "/write");
343 function onMenuDeleteContact(event, node)
345 uixDeleteSelectedContacts(node);
350 function onToolbarEditSelectedContacts(event)
352 var contactsList = $('contactsList');
353 var rows = contactsList.getSelectedRowsId();
355 for (var i = 0; i < rows.length; i++) {
356 openContactWindow(null,
357 CurrentContactFolderURL()
358 + "/" + rows[i] + "/edit");
364 function onToolbarWriteToSelectedContacts(event)
366 var contactsList = $('contactsList');
367 var rows = contactsList.getSelectedRowsId();
369 for (var i = 0; i < rows.length; i++)
370 openMailComposeWindow(CurrentContactFolderURL()
371 + "/" + rows[i] + "/write");
376 function uixDeleteSelectedContacts(sender)
379 var contactsList = $('contactsList');
380 var rows = contactsList.getSelectedRowsId();
382 var contactView = $('contactView');
383 contactView.innerHTML = '';
385 for (var i = 0; i < rows.length; i++) {
386 var url, http, rowElem;
388 /* send AJAX request (synchronously) */
390 url = (CurrentContactFolderURL() + "/"
391 + rows[i] + "/delete");
392 http = createHTTPClient();
393 http.open("POST", url, false /* not async */);
395 if (http.status != 200) { /* request failed */
402 /* remove from page */
404 /* line-through would be nicer, but hiding is OK too */
405 rowElem = $(rows[i]);
406 rowElem.parentNode.removeChild(rowElem);
410 alert("Could not delete " + failCount + " messages!");
415 function newEmailTo(sender) {
416 var mailto = sanitizeMailTo(sender.parentNode.parentNode.menuTarget.innerHTML);
418 if (mailto.length > 0)
420 w = window.open("compose?mailto=" + mailto,
422 "width=680,height=520,resizable=1,scrollbars=1,toolbar=0," +
423 "location=0,directories=0,status=0,menubar=0,copyhistory=0");
427 return false; /* stop following the link */
430 function onHeaderClick(event)
432 if (document.contactsListAjaxRequest) {
433 document.contactsListAjaxRequest.aborted = true;
434 document.contactsListAjaxRequest.abort();
436 url = CurrentContactFolderURL() + "/" + this.link;
437 if (!this.link.match(/noframe=/))
439 document.contactsListAjaxRequest
440 = triggerAjaxRequest(url, contactsListCallback);
442 event.preventDefault();
445 function registerDraggableMessageNodes()
447 log ("can we drag...");
450 function newContact(sender) {
451 openContactWindow(sender,
452 CurrentContactFolderURL() + "/new");
454 return false; /* stop following the link */
457 function onFolderSelectionChange()
459 var folderList = $("contactFolders");
460 var nodes = folderList.getSelectedNodes();
461 $("contactView").innerHTML = '';
463 if (nodes[0].hasClassName("denied")) {
464 var div = $("contactsListContent");
469 var externalFolder = nodes[0].getAttribute("external-addressbook");
471 newFolder = externalFolder;
473 newFolder = nodes[0].getAttribute("id");
475 openContactsFolder(newFolder, null, externalFolder);
479 function onSearchFormSubmit()
481 var searchValue = $("searchValue");
483 openContactsFolder(currentContactFolder, "search=" + searchValue.value);
488 function onConfirmContactSelection(tag)
490 var folderLi = $(currentContactFolder);
491 var currentContactFolderName = folderLi.innerHTML;
492 var selectorList = null;
493 var initialValues = null;
497 var selectorId = selector.getAttribute("id");
498 selectorList = opener.window.document.getElementById('uixselector-'
501 initialValues = selectorList.value;
504 var contactsList = $("contactsList");
505 var rows = contactsList.getSelectedRows();
506 for (i = 0; i < rows.length; i++) {
507 var cid = rows[i].getAttribute("contactid");
508 var cname = '' + rows[i].getAttribute("contactname");
509 var email = '' + rows[i].cells[1].innerHTML;
510 opener.window.addContact(tag, currentContactFolderName + '/' + cname,
514 if (selector && selector.changeNotification
515 && selectorList.value != initialValues)
516 selector.changeNotification("addition");
521 function onConfirmAddressBookSelection() {
522 var folderLi = $(currentContactFolder);
523 var currentContactFolderName = folderLi.innerHTML;
525 var selector = window.opener.document.getElementById("contactFolders");
526 var initialValues = selector.getAttribute("additional-addressbooks");
529 var newValues = initialValues;
531 var contactsList = $("contactsList");
532 var rows = contactsList.getSelectedRows();
533 for (i = 0; i < rows.length; i++) {
534 var cid = rows[i].getAttribute("contactid");
535 var cname = '' + rows[i].getAttribute("contactname");
536 var email = '' + rows[i].cells[1].innerHTML;
537 var re = new RegExp("(^|,)" + cid + "($|,)");
538 if (!re.test(newValues)) {
539 if (newValues.length)
540 newValues += "," + cid;
546 if (newValues != initialValues)
547 window.opener.setTimeout("setAdditionalAddressBooks(\""
548 + newValues + "\");", 100);
553 function setAdditionalAddressBooks(additionalAddressBooks) {
554 var urlstr = (ApplicationBaseURL + "/updateAdditionalAddressBooks?ids="
555 + additionalAddressBooks);
556 if (document.addressBooksAjaxRequest) {
557 document.addressBooksAjaxRequest.aborted = true;
558 document.addressBooksAjaxRequest.abort();
560 document.addressBooksAjaxRequest
561 = triggerAjaxRequest(urlstr,
562 addressBooksCallback, additionalAddressBooks);
565 function addressBooksCallback(http) {
566 if (http.readyState == 4) {
567 if (http.status == 200) {
568 var ul = $("contactFolders");
570 var children = ul.childNodesWithTag("li");
571 for (var i = 0; i < children.length; i++)
572 if (children[i].getAttribute("external-addressbook"))
573 ul.removeChild(children[i]);
575 ul.setAttribute("additional-addressbooks", http.callbackData);
576 if (http.callbackData.length > 0) {
577 var list = http.callbackData.split(",");
579 for (var i = 0; i < list.length; i++) {
580 var username = list[i];
581 newCode += ( "<li external-addressbook=\"" + username + "\""
582 + " onmousedown=\"return false;\""
583 + " onclick=\"return onRowClick(event);\""
584 + " oncontextmenu=\"return onContactFolderContextMenu(event);\">" );
585 newCode += ( username + "</li>" );
587 ul.innerHTML += newCode;
590 document.addressBooksAjaxRequest = null;
593 log ("ajax fuckage");
596 function onContactMailTo(node) {
597 return openMailTo(node.innerHTML);
600 function refreshContacts(contactId) {
601 openContactsFolder(currentContactFolder, "reload=true", currentFolderIsExternal);
602 cachedContacts[currentContactFolder + "/" + contactId] = null;
603 loadContact(contactId);
608 function onAddressBookAdd(node) {
609 var selector = $("contactFolders");
610 var selectorURL = '?popup=YES&selectorId=contactFolders';
612 urlstr = ApplicationBaseURL;
613 if (urlstr[urlstr.length-1] != '/')
615 urlstr += ("../../" + UserLogin + "/Contacts/"
616 + contactSelectorAction + selectorURL);
618 var w = window.open(urlstr, "Addressbook",
619 "width=640,height=400,resizable=1,scrollbars=0");
620 w.selector = selector;
627 function onAddressBookRemove(node) {
628 var selector = $("contactFolders");
629 var nodes = selector.getSelectedNodes();
630 if (nodes.length > 0) {
631 var cid = nodes[0].getAttribute("external-addressbook");
633 var initialValues = selector.getAttribute("additional-addressbooks");
634 var re = new RegExp("(^|,)" + cid + "($|,)");
635 var newValues = initialValues.replace(re, "");
636 if (initialValues != newValues)
637 setAdditionalAddressBooks(newValues);
639 var personal = $("/personal");
641 onFolderSelectionChange();
648 function configureDragHandles() {
649 var handle = $("dragHandle");
651 handle.addInterface(SOGoDragHandlesInterface);
652 handle.leftBlock=$("contactFoldersList");
653 handle.rightBlock=$("rightPanel");
656 handle = $("rightDragHandle");
658 handle.addInterface(SOGoDragHandlesInterface);
659 handle.upperBlock=$("contactsListContent");
660 handle.lowerBlock=$("contactView");
664 function lookupDeniedFolders() {
666 var http = createHTTPClient();
668 http.url = ApplicationBaseURL + "/checkRights";
669 http.open("GET", http.url, false /* not async */);
671 if (http.status == 200
672 && http.responseText.length > 0) {
673 rights = http.responseText.split(",");
680 function configureContactFolders() {
681 var contactFolders = $("contactFolders");
682 if (contactFolders) {
683 contactFolders.addEventListener("selectionchange",
684 onFolderSelectionChange, false);
685 var lis = contactFolders.childNodesWithTag("li");
686 for (var i = 0; i < lis.length; i++) {
687 lis[i].addEventListener("mousedown", listRowMouseDownHandler, false);
688 lis[i].addEventListener("click", onRowClick, false);
689 lis[i].addEventListener("contextmenu", onContactFoldersContextMenu, false);
692 var denieds = lookupDeniedFolders();
694 var start = (lis.length - denieds.length);
695 for (var i = start; i < lis.length; i++) {
696 if (denieds[i-start] == "1")
697 lis[i].removeClassName("denied");
699 lis[i].addClassName("denied");
702 contactFolders.style.visibility = "visible;";
706 function onAccessRightsMenuEntryMouseUp(event) {
707 var folders = $("contactFolders");
708 var selected = folders.getSelectedNodes()[0];
709 var external = selected.getAttribute("external-addressbook");
710 var title = this.innerHTML;
712 url = UserFolderURL + "../" + external + "/Contacts/personal/acls";
714 url = ApplicationBaseURL + selected.getAttribute("id") + "/acls";
716 openAclWindow(url, title);
719 function initializeMenus() {
720 var menus = new Array("contactFoldersMenu", "contactMenu", "searchMenu");
721 initMenusNamed(menus);
723 var menuEntry = $("accessRightsMenuEntry");
724 menuEntry.addEventListener("mouseup", onAccessRightsMenuEntryMouseUp, false);
728 handleEvent: function (event) {
729 configureContactFolders();
734 window.addEventListener("load", initContacts, false);