]> err.no Git - scalable-opengroupware.org/blobdiff - UI/WebServerResources/ContactsUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1305 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / ContactsUI.js
index f38c9d05b689025b29efb6ea81121f54eba57f37..21c9872f293df3add7507a16c1b3451bcb4e6d00 100644 (file)
@@ -14,12 +14,12 @@ function validateEditorInput(sender) {
   if (field.value == "")
     errortext = errortext + labels.error_missingsubject + "\n";
 
-  if (!UIxRecipientSelectorHasRecipients())
+  if (!hasRecipients())
     errortext = errortext + labels.error_missingrecipients + "\n";
   
   if (errortext.length > 0) {
-    alert(labels.error_validationfailed.decodeEntities() + ":\n"
-          + errortext.decodeEntities());
+    alert(labels.error_validationfailed + ":\n"
+          + errortext);
     return false;
   }
   return true;
@@ -46,8 +46,8 @@ function openContactsFolder(contactsFolder, reload, idx) {
         var contactsList = $("contactsList");
         if (contactsList)
            selection = contactsList.getSelectedRowsId();
-        else
-           window.alert("no contactsList");
+//        else
+//           window.alert("no contactsList");
      }
      else
        selection = null;
@@ -73,59 +73,81 @@ function openContactsFolderAtIndex(element) {
     = triggerAjaxRequest(url, contactsListCallback);
 }
 
-function configureContactsListHeaders(cells) {
-   for (var i = 0; i < cells.length; i++) {
-      var currentCell = $(cells[i]);
-      Event.observe(currentCell, "click",
-                   onHeaderClick.bindAsEventListener(currentCell));
-      Event.observe(currentCell, "mousedown", listRowMouseDownHandler);
-   }
-}
-
 function contactsListCallback(http) {
-  var div = $("contactsListContent");
-
-  if (http.readyState == 4
-      && http.status == 200) {
-    document.contactsListAjaxRequest = null;
-    div.innerHTML = http.responseText;
-
-    var table = $("contactsList");
-    if (table)
-       configureContactsListHeaders(table.tBodies[0].rows[0].cells);
-
-    if (sorting["attribute"] && sorting["attribute"].length > 0) {
-       var sortHeader;
-       if (sorting["attribute"] == "displayName")
+  if (http.readyState == 4) {
+    if (http.status == 200) {
+      document.contactsListAjaxRequest = null;
+
+      var table = $("contactsList");
+      if (table) {
+       // Update table
+       var data = http.responseText;
+       var html = data.replace(/^(.*\n)*.*(<table(.*\n)*)$/, "$2");
+       var tbody = table.tBodies[0]; 
+       var tmp = document.createElement('div');
+       $(tmp).update(html);
+       table.replaceChild(tmp.firstChild.tBodies[0], tbody);
+      }
+      else {
+       // Add table (doesn't happen .. yet)
+       var div = $("contactsListContent");
+       div.update(http.responseText);
+       table = $("contactsList");
+       configureSortableTableHeaders(table);
+       TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true});
+      }
+    
+      if (sorting["attribute"] && sorting["attribute"].length > 0) {
+       var sortHeader;
+       if (sorting["attribute"] == "displayName")
          sortHeader = $("nameHeader");
-       else if (sorting["attribute"] == "mail")
+       else if (sorting["attribute"] == "mail")
          sortHeader = $("mailHeader");
-       else if (sorting["attribute"] == "screenName")
+       else if (sorting["attribute"] == "screenName")
          sortHeader = $("screenNameHeader");
-       else if (sorting["attribute"] == "org")
+       else if (sorting["attribute"] == "org")
          sortHeader = $("orgHeader");
-       else if (sorting["attribute"] == "phone")
+       else if (sorting["attribute"] == "phone")
          sortHeader = $("phoneHeader");
-       else
+       else
          sortHeader = null;
        
-       if (sortHeader) {
+       if (sortHeader) {
+         var sortImages = $(table.tHead).getElementsByClassName("sortImage");
+         $(sortImages).each(function(item) {
+             item.remove();
+           });
+
          var sortImage = createElement("img", "messageSortImage", "sortImage");
          sortHeader.insertBefore(sortImage, sortHeader.firstChild);
          if (sorting["ascending"])
-            sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
+           sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
          else
-            sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
-       }
-    }
+           sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
+       }
+      }
 
-    var selected = http.callbackData;
-    if (selected) {
-       for (var i = 0; i < selected.length; i++) {
+      var selected = http.callbackData;
+      if (selected) {
+       for (var i = 0; i < selected.length; i++) {
          var row = $(selected[i]);
          if (row)
-            row.select();
-       }
+           row.select();
+       }
+      }
+    }
+    else {
+      var table = $("contactsList");
+      if (table) {
+       var sortImages = $(table.tHead).getElementsByClassName("sortImage");
+       $(sortImages).each(function(item) {
+           item.remove();
+         });
+       var tBody = $(table.tBodies[0]);
+       var length = tBody.rows.length;
+       for (var i = length - 1; i > -1; i--)
+         tBody.removeChild(tBody.rows[i]);
+      }
     }
   }
   else
@@ -147,11 +169,10 @@ function onContactFoldersContextMenu(event) {
   $(this).select();
 }
 
-function onContactContextMenu(event, element) {
+function onContactContextMenu(event, element) { log ("onContactContextMenu");
   var menu = $("contactMenu");
-  //Event.observe(menu, "hideMenu", onContactContextMenuHide, false);
+
   Event.observe(menu, "mousedown", onContactContextMenuHide, false);
-  //document.documentElement.onclick = onContactContextMenuHide;
   popupMenu(event, "contactMenu", element);
 
   var topNode = $("contactsList");
@@ -289,10 +310,20 @@ function onMenuEditContact(event) {
 }
 
 function onMenuWriteToContact(event) {
-   var contactId = document.menuTarget.getAttribute('id');
+  var contactId = document.menuTarget.getAttribute('id');
+  var contactRow = $(contactId);
+  var emailCell = contactRow.down('td', 1);
+
+  if (!emailCell.firstChild) { // .nodeValue is the contact email address
+    window.alert(labels["The selected contact has no email address."]);
+    return false;
+  }
+
+  openMailComposeWindow(ApplicationBaseURL + currentContactFolder
+                       + "/" + contactId + "/write");
 
-   openMailComposeWindow(ApplicationBaseURL + currentContactFolder
-                        + "/" + contactId + "/write");
+  if (document.body.hasClassName("popup"))
+    window.close();
 }
 
 function onMenuDeleteContact(event) {
@@ -303,6 +334,11 @@ function onToolbarEditSelectedContacts(event) {
   var contactsList = $('contactsList');
   var rows = contactsList.getSelectedRowsId();
 
+  if (rows.length == 0) {
+    window.alert(labels["Please select a contact."]);
+    return false;
+  }
+
   for (var i = 0; i < rows.length; i++) {
     openContactWindow(URLForFolderID(currentContactFolder)
                       + "/" + rows[i] + "/edit", rows[i]);
@@ -314,10 +350,27 @@ function onToolbarEditSelectedContacts(event) {
 function onToolbarWriteToSelectedContacts(event) {
   var contactsList = $('contactsList');
   var rows = contactsList.getSelectedRowsId();
+  var rowsWithEmail = 0;
+
+  if (rows.length == 0) {
+    openMailComposeWindow(ApplicationBaseURL + "Mail/compose");
+    return false;
+  }
+
+  for (var i = 0; i < rows.length; i++) {
+    var emailCell = $(rows[i]).down('td', 1);
+    if (emailCell.firstChild) { // .nodeValue is the contact email address
+      rowsWithEmail++;
+      openMailComposeWindow(ApplicationBaseURL + currentContactFolder
+                           + "/" + rows[i] + "/write");
+    }
+  }
 
-  for (var i = 0; i < rows.length; i++)
-    openMailComposeWindow(ApplicationBaseURL + currentContactFolder
-                          + "/" + rows[i] + "/write");
+  if (rowsWithEmail == 0) {
+    window.alert(labels["The selected contact has no email address."]);
+  }
+  else if (document.body.hasClassName("popup"))
+    window.close();
 
   return false;
 }
@@ -327,6 +380,11 @@ function uixDeleteSelectedContacts(sender) {
   var contactsList = $('contactsList');
   var rows = contactsList.getSelectedRowsId();
 
+  if (rows.length == 0) {
+    window.alert(labels["Please select a contact."]);
+    return false;
+  }
+
   var contactView = $('contactView');
   contactView.innerHTML = '';
 
@@ -392,7 +450,7 @@ function onHeaderClick(event) {
 
    refreshCurrentFolder();
 
-   preventDefault(event);
+   Event.stop(event);
 }
 
 function newContact(sender) {
@@ -408,7 +466,7 @@ function onFolderSelectionChange() {
   
    if (nodes[0].hasClassName("denied")) {
       var div = $("contactsListContent");
-      div.innerHTML = "";
+      div.update();
    }
    else {
       search = {};
@@ -420,7 +478,7 @@ function onFolderSelectionChange() {
 }
 
 function refreshCurrentFolder() {
-   openContactsFolder(currentContactFolder, true);
+  openContactsFolder(currentContactFolder, true);
 }
 
 function onConfirmContactSelection(event) {
@@ -444,7 +502,7 @@ function onConfirmContactSelection(event) {
       var cid = rows[i].getAttribute("contactid");
       var cname = '' + rows[i].getAttribute("contactname");
       var email = '' + rows[i].cells[1].innerHTML;
-      opener.window.addContact(tag, currentContactFolderName + '/' + cname,
+      window.opener.addContact(tag, currentContactFolderName + '/' + cname,
                               cid, cname, email);
    }
 
@@ -468,28 +526,49 @@ function refreshContacts(contactId) {
 }
 
 function onAddressBookNew(event) {
-  var name = window.prompt(labels["Name of the Address Book"].decodeEntities());
-  if (name) {
-    if (document.newAbAjaxRequest) {
-      document.newAbAjaxRequest.aborted = true;
-      document.newAbAjaxRequest.abort();
-    }
-    var url = ApplicationBaseURL + "/newAb?name=" + name;
-    document.newAbAjaxRequest
-       = triggerAjaxRequest(url, newAbCallback, name);
-  }
+  createFolder(window.prompt(labels["Name of the Address Book"]),
+              appendAddressBook);
   preventDefault(event);
 }
 
 function appendAddressBook(name, folder) {
-   var li = document.createElement("li");
-   $("contactFolders").appendChild(li);
-   li.setAttribute("id", folder);
-   li.appendChild(document.createTextNode(name));
-   setEventsOnContactFolder(li);
+  var owner;
+  var result = true;
+
+  if (folder) {
+    owner = getSubscribedFolderOwner(folder);
+    folder = accessToSubscribedFolder(folder);
+  }
+  else
+    folder = "/" + name;
+  
+  if (!owner)
+    owner = UserLogin;
+
+  if ($(folder))
+    result = false;
+  else {
+    var contactFolders = $("contactFolders");
+    var items = contactFolders.childNodesWithTag("li");
+    var li = document.createElement("li");
+
+    // Add the calendar to the proper place
+    var i = getListIndexForFolder(items, owner, name);
+    if (i != items.length) // User is subscribed to other calendars of the same owner
+      contactFolders.insertBefore(li, items[i]);
+    else 
+      contactFolders.appendChild(li);
+
+    li.setAttribute("id", folder);
+    li.setAttribute("owner", owner);
+    li.appendChild(document.createTextNode(name));
+    setEventsOnContactFolder(li);
+  }
+
+  return result;
 }
 
-function newAbCallback(http) {
+function newFolderCallback(http) {
   if (http.readyState == 4
       && http.status == 201) {
      var name = http.callbackData;
@@ -523,60 +602,60 @@ function onAddressBookRemove(event) {
   var selector = $("contactFolders");
   var nodes = selector.getSelectedNodes();
   if (nodes.length > 0) { 
-     nodes[0].deselect();
-     var folderId = nodes[0].getAttribute("id");
-     var folderIdElements = folderId.split(":");
-     if (folderIdElements.length > 1)
-       unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId);
-     else {
-       var abId = folderIdElements[0].substr(1);
-       deletePersonalAddressBook(abId);
-       var personal = $("/personal");
-       personal.select();
-       onFolderSelectionChange();
-     }
+    nodes[0].deselect();
+    var folderId = nodes[0].getAttribute("id");
+    var folderIdElements = folderId.split("_");
+    if (folderIdElements.length > 1)
+      unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId);
+    else {
+      var abId = folderIdElements[0].substr(1);
+      deletePersonalAddressBook(abId);
+      var personal = $("/personal");
+      personal.select();
+      onFolderSelectionChange();
+    }
   }
 
   preventDefault(event);
 }
 
 function deletePersonalAddressBook(folderId) {
-   var label
-      = labels["Are you sure you want to delete the selected address book?"];
-   if (window.confirm(label.decodeEntities())) {
-      if (document.deletePersonalABAjaxRequest) {
-        document.deletePersonalABAjaxRequest.aborted = true;
-        document.deletePersonalABAjaxRequest.abort();
-      }
-      var url = ApplicationBaseURL + "/" + folderId + "/delete";
-      document.deletePersonalABAjaxRequest
-        = triggerAjaxRequest(url, deletePersonalAddressBookCallback,
-                             folderId);
-   }
+  var label
+    = labels["Are you sure you want to delete the selected address book?"];
+  if (window.confirm(label)) {
+    if (document.deletePersonalABAjaxRequest) {
+      document.deletePersonalABAjaxRequest.aborted = true;
+      document.deletePersonalABAjaxRequest.abort();
+    }
+    var url = ApplicationBaseURL + "/" + folderId + "/deleteFolder";
+    document.deletePersonalABAjaxRequest
+      = triggerAjaxRequest(url, deletePersonalAddressBookCallback,
+                          folderId);
+  }
 }
 
 function deletePersonalAddressBookCallback(http) {
   if (http.readyState == 4) {
-     if (http.status == 200) {
-       var ul = $("contactFolders");
+    if (isHttpStatus204(http.status)) {
+      var ul = $("contactFolders");
        
-       var children = ul.childNodesWithTag("li");
-       var i = 0;
-       var done = false;
-       while (!done && i < children.length) {
-          var currentFolderId = children[i].getAttribute("id").substr(1);
-          if (currentFolderId == http.callbackData) {
-             ul.removeChild(children[i]);
-             done = true;
-          }
-          else
-             i++;
+      var children = ul.childNodesWithTag("li");
+      var i = 0;
+      var done = false;
+      while (!done && i < children.length) {
+       var currentFolderId = children[i].getAttribute("id").substr(1);
+       if (currentFolderId == http.callbackData) {
+         ul.removeChild(children[i]);
+         done = true;
        }
-     }
-     document.deletePersonalABAjaxRequest = null;
+       else
+         i++;
+      }
+    }
+    document.deletePersonalABAjaxRequest = null;
   }
   else
-     log ("ajax problem 5: " + http.status);
+    log ("ajax problem 5: " + http.status);
 }
 
 function configureDragHandles() {
@@ -585,6 +664,7 @@ function configureDragHandles() {
     handle.addInterface(SOGoDragHandlesInterface);
     handle.leftBlock=$("contactFoldersList");
     handle.rightBlock=$("rightPanel");
+    handle.leftMargin = 100;
   }
 
   handle = $("rightDragHandle");
@@ -600,7 +680,6 @@ function lookupDeniedFolders() {
   for (var i = 0; i < list.length; i++) {
      var folderID = list[i].getAttribute("id");
      var url = URLForFolderID(folderID) + "/canAccessContent";
-     
      triggerAjaxRequest(url, deniedFoldersLookupCallback, folderID);
   }
 }
@@ -648,25 +727,87 @@ function setEventsOnContactFolder(node) {
                 onContactFoldersContextMenu.bindAsEventListener(node), false);
 }
 
+function onMenuModify(event) {
+  var folders = $("contactFolders");
+  var selected = folders.getSelectedNodes()[0];
+
+  if (UserLogin == selected.getAttribute("owner")) {
+    var currentName = selected.innerHTML;
+    var newName = window.prompt(labels["Address Book Name"],
+                               currentName);
+    if (newName && newName.length > 0
+       && newName != currentName) {
+      var url = (URLForFolderID(selected.getAttribute("id"))
+                + "/renameFolder?name=" + escape(newName.utf8encode()));
+      triggerAjaxRequest(url, folderRenameCallback,
+                        {node: selected, name: newName});
+    }
+  } else
+    window.alert(clabels["Unable to rename that folder!"]);
+}
+
+function folderRenameCallback(http) {
+  if (http.readyState == 4) {
+    if (isHttpStatus204(http.status)) {
+      var dict = http.callbackData;
+      dict["node"].innerHTML = dict["name"];
+    }
+  }
+}
+
 function onMenuSharing(event) {
+  if ($(this).hasClassName("disabled"))
+    return;
+
    var folders = $("contactFolders");
    var selected = folders.getSelectedNodes()[0];
-   var title = this.innerHTML;
-   var url = URLForFolderID(selected.getAttribute("id"));
+   var owner = selected.getAttribute("owner");
+   if (owner == "nobody")
+     window.alert(clabels["The user rights cannot be"
+                         + " edited for this object!"]);
+   else {
+     var title = this.innerHTML;
+     var url = URLForFolderID(selected.getAttribute("id"));
+
+     openAclWindow(url + "/acls", title);
+   }
+}
+
+function onContactFoldersMenuPrepareVisibility() {
+  var folders = $("contactFolders");
+  var selected = folders.getSelectedNodes();  
 
-   openAclWindow(url + "/acls", title);
+  if (selected.length > 0) {
+    var folderOwner = selected[0].getAttribute("owner");
+    var modifyOption = $(this).down("ul").childElements().first();
+    var sharingOption = $(this).down("ul").childElements().last();
+    // Disable the "Sharing" and "Modify" options when address book
+    // is not owned by user
+    if (folderOwner == UserLogin || IsSuperUser) {
+      modifyOption.removeClassName("disabled");
+      sharingOption.removeClassName("disabled");
+    }
+    else {
+      modifyOption.addClassName("disabled");
+      sharingOption.addClassName("disabled");
+    }
+  }
 }
 
 function getMenus() {
    var menus = {};
-   menus["contactFoldersMenu"] = new Array(null, "-", null,
+   menus["contactFoldersMenu"] = new Array(onMenuModify, "-", null,
                                           null, "-", null, "-",
                                           onMenuSharing);
    menus["contactMenu"] = new Array(onMenuEditContact, "-",
                                    onMenuWriteToContact, null, "-",
                                    onMenuDeleteContact);
    menus["searchMenu"] = new Array(setSearchCriteria);
-
+   
+   var contactFoldersMenu = $("contactFoldersMenu");
+   if (contactFoldersMenu)
+     contactFoldersMenu.prepareVisibility = onContactFoldersMenuPrepareVisibility;
+   
    return menus;
 }
 
@@ -688,6 +829,18 @@ function initContacts(event) {
      configureSelectionButtons();
    configureContactFolders();
 //     initDnd();
+
+   var table = $("contactsList");
+   if (table) {
+     // Initialize contacts table
+     table.multiselect = true;
+     configureSortableTableHeaders(table);
+     TableKit.Resizable.init(table, {'trueResize' : true, 'keepWidth' : true});
+   }
+
+   // Default sort options
+   sorting["attribute"] = "displayName";
+   sorting["ascending"] = true;
 }
 
-addEvent(window, 'load', initContacts);
+FastInit.addOnLoad(initContacts);