]> err.no Git - scalable-opengroupware.org/blobdiff - UI/WebServerResources/ContactsUI.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1131 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / ContactsUI.js
index caee6cdb7cec219ed5aa13c79205436d0a38fb45..7ed9b7b2d804e330e1569d72ada4adbf08324f20 100644 (file)
@@ -1,7 +1,10 @@
 /* JavaScript for SOGoContacts */
 
 var cachedContacts = new Array();
-var currentContactFolder = '/personal';
+var currentContactFolder = null;
+
+var usersRightsWindowHeight = 200;
+var usersRightsWindowWidth = 450;
 
 function openContactWindow(sender, url) {
   var msgWin = window.open(url, null, "width=450,height=600,resizable=0");
@@ -27,8 +30,23 @@ function validateEditorInput(sender) {
   return true;
 }
 
-function openContactsFolder(contactsFolder, params) {
-  if (contactsFolder != currentContactFolder || params) {
+function openContactsFolder(contactsFolder, reload, idx) {
+  if ((currentContactFolder && contactsFolder != currentContactFolder)
+      || reload) {
+     currentContactFolder = contactsFolder; log("openContactsFolder " + contactsFolder);
+     var url = URLForFolderID(currentContactFolder) +
+       "/view?noframe=1";
+
+     var searchValue = search["value"];
+     if (searchValue && searchValue.length > 0)
+       url += ("&search=" + search["criteria"]
+               + "&value=" + searchValue);
+     var sortAttribute = sorting["attribute"];
+     if (sortAttribute && sortAttribute.length > 0)
+       url += ("&sort=" + sorting["attribute"]
+               + "&asc=" + sorting["ascending"]);
+
+     var selection;
      if (contactsFolder == currentContactFolder) {
         var contactsList = $("contactsList");
         if (contactsList)
@@ -37,21 +55,14 @@ function openContactsFolder(contactsFolder, params) {
            window.alert("no contactsList");
      }
      else
-      selection = null;
-
-    currentContactFolder = contactsFolder;
-    var url = URLForFolderID(currentContactFolder) +
-       "/view?noframe=1&sort=cn&desc=0";
-    if (params)
-      url += '&' + params;
-
-    var selection;
-    if (document.contactsListAjaxRequest) {
-      document.contactsListAjaxRequest.aborted = true;
-      document.contactsListAjaxRequest.abort();
-    }
-    document.contactsListAjaxRequest
-      = triggerAjaxRequest(url, contactsListCallback, selection);
+       selection = null;
+
+     if (document.contactsListAjaxRequest) {
+       document.contactsListAjaxRequest.aborted = true;
+       document.contactsListAjaxRequest.abort();
+     }
+     document.contactsListAjaxRequest
+       = triggerAjaxRequest(url, contactsListCallback, selection);
   }
 }
 
@@ -67,6 +78,15 @@ 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");
 
@@ -74,21 +94,53 @@ function contactsListCallback(http) {
       && 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"] == "cn")
+         sortHeader = $("nameHeader");
+       else if (sorting["attribute"] == "mail")
+         sortHeader = $("mailHeader");
+       else if (sorting["attribute"] == "screenname")
+         sortHeader = $("screenNameHeader");
+       else if (sorting["attribute"] == "o")
+         sortHeader = $("orgHeader");
+       else if (sorting["attribute"] == "telephonenumber")
+         sortHeader = $("phoneHeader");
+       else
+         sortHeader = null;
+       
+       if (sortHeader) {
+         var sortImage = createElement("img", "messageSortImage", "sortImage");
+         sortHeader.insertBefore(sortImage, sortHeader.firstChild);
+         if (sorting["ascending"])
+            sortImage.src = ResourcesURL + "/title_sortdown_12x12.png";
+         else
+            sortImage.src = ResourcesURL + "/title_sortup_12x12.png";
+       }
+    }
+
     var selected = http.callbackData;
     if (selected) {
-        for (var i = 0; i < selected.length; i++)
-          $(selected[i]).select();
+       for (var i = 0; i < selected.length; i++) {
+         var row = $(selected[i]);
+         if (row)
+            row.select();
+       }
     }
-    configureSortableTableHeaders();
   }
   else
-    log ("ajax fuckage 1");
+    log ("ajax problem 1: status = " + http.status);
 }
 
 function onContactFoldersContextMenu(event) {
   var menu = $("contactFoldersMenu");
-  menu.addEventListener("hideMenu", onContactFoldersContextMenuHide, false);
-  onMenuClick(event, "contactFoldersMenu");
+  Event.observe(menu, "hideMenu", onContactFoldersContextMenuHide, false);
+  popupMenu(event, "contactFoldersMenu", this);
 
   var topNode = $("contactFolders");
   var selectedNodes = topNode.getSelectedRows();
@@ -101,8 +153,8 @@ function onContactFoldersContextMenu(event) {
 
 function onContactContextMenu(event, element) {
   var menu = $("contactMenu");
-  menu.addEventListener("hideMenu", onContactContextMenuHide, false);
-  onMenuClick(event, "contactMenu");
+  Event.observe(menu, "hideMenu", onContactContextMenuHide, false);
+  popupMenu(event, "contactMenu", element);
 
   var topNode = $("contactsList");
   var selectedNodes = topNode.getSelectedRows();
@@ -183,7 +235,7 @@ function contactLoadCallback(http) {
     div.innerHTML = content;
   }
   else
-    log ("ajax fuckage 2");
+    log ("ajax problem 2: " + http.status);
 }
 
 var rowSelectionCount = 0;
@@ -232,31 +284,23 @@ function onContactRowDblClick(event, node) {
   return false;
 }
 
-function onMenuEditContact(event, node) {
-  var node = getParentMenu(node).menuTarget.parentNode;
-  var contactId = node.getAttribute('id');
+function onMenuEditContact(event) {
+  var contactId = document.menuTarget.getAttribute('id');
 
   openContactWindow(null,
                     URLForFolderID(currentContactFolder)
                     + "/" + contactId + "/edit");
-
-  return false;
 }
 
-function onMenuWriteToContact(event, node) {
-  var node = getParentMenu(node).menuTarget.parentNode;
-  var contactId = node.getAttribute('id');
-
-  openMailComposeWindow(ApplicationBaseURL + currentContactFolder
-                        + "/" + contactId + "/write");
+function onMenuWriteToContact(event) {
+   var contactId = document.menuTarget.getAttribute('id');
 
-  return false;
+   openMailComposeWindow(ApplicationBaseURL + currentContactFolder
+                        + "/" + contactId + "/write");
 }
 
-function onMenuDeleteContact(event, node) {
-  uixDeleteSelectedContacts(node);
-
-  return false;
+function onMenuDeleteContact(event) {
+  uixDeleteSelectedContacts(this);
 }
 
 function onToolbarEditSelectedContacts(event) {
@@ -337,17 +381,31 @@ function newEmailTo(sender) {
 }
 
 function onHeaderClick(event) {
-  if (document.contactsListAjaxRequest) {
-    document.contactsListAjaxRequest.aborted = true;
-    document.contactsListAjaxRequest.abort();
-  }
-  url = URLForFolderID(currentContactFolder) + "/" + this.link;
-  if (!this.link.match(/noframe=/))
-    url += "&noframe=1";
-  document.contactsListAjaxRequest
-    = triggerAjaxRequest(url, contactsListCallback);
+   var headerId = this.getAttribute("id");
+   var newSortAttribute;
+   if (headerId == "nameHeader")
+      newSortAttribute = "cn";
+   else if (headerId == "mailHeader")
+      newSortAttribute = "mail";
+   else if (headerId == "screenNameHeader")
+      newSortAttribute = "screenname";
+   else if (headerId == "orgHeader")
+      newSortAttribute = "o";
+   else if (headerId == "phoneHeader")
+      newSortAttribute = "telephonenumber";
+
+   log("header: " + headerId);
+
+   if (sorting["attribute"] == newSortAttribute)
+      sorting["ascending"] = !sorting["ascending"];
+   else {
+      sorting["attribute"] = newSortAttribute;
+      sorting["ascending"] = true;
+   }
+
+   refreshCurrentFolder();
 
-  event.preventDefault();
+   preventDefault(event);
 }
 
 function registerDraggableMessageNodes() {
@@ -370,17 +428,17 @@ function onFolderSelectionChange() {
       var div = $("contactsListContent");
       div.innerHTML = "";
    }
-   else
-      openContactsFolder(nodes[0].getAttribute("id"), null);
+   else {
+      search = {};
+      sorting = {};
+      $("searchValue").value = "";
+      initCriteria();
+      openContactsFolder(nodes[0].getAttribute("id"));
+   }
 }
 
-function onSearchFormSubmit() {
-  var searchValue = $("searchValue");
-
-  openContactsFolder(URLForFolderID(currentContactFolder),
-                    "search=" + searchValue.value);
-
-  return false;
+function refreshCurrentFolder() { log("refreshCurrentFolder");
+   openContactsFolder(currentContactFolder, true);
 }
 
 function onConfirmContactSelection(event) {
@@ -412,7 +470,7 @@ function onConfirmContactSelection(event) {
        && selectorList.value != initialValues)
       selector.changeNotification("addition");
 
-   event.preventDefault();
+   preventDefault(event);
 }
 
 function onContactMailTo(node) {
@@ -420,11 +478,11 @@ function onContactMailTo(node) {
 }
 
 function refreshContacts(contactId) {
-  openContactsFolder(currentContactFolder, "reload=true");
-  cachedContacts[currentContactFolder + "/" + contactId] = null;
-  loadContact(contactId);
+   refreshCurrentFolder();
+   cachedContacts[currentContactFolder + "/" + contactId] = null;
+   loadContact(contactId);
 
-  return false;
+   return false;
 }
 
 function onAddressBookNew(event) {
@@ -438,17 +496,15 @@ function onAddressBookNew(event) {
     document.newAbAjaxRequest
        = triggerAjaxRequest(url, newAbCallback, name);
   }
-  event.preventDefault();
+  preventDefault(event);
 }
 
 function appendAddressBook(name, folder) {
    var li = document.createElement("li");
+   $("contactFolders").appendChild(li);
    li.setAttribute("id", folder);
    li.appendChild(document.createTextNode(name));
-   li.addEventListener("mousedown", listRowMouseDownHandler, false);
-   li.addEventListener("click", onRowClick, false);
-   li.addEventListener("contextmenu", onContactFoldersContextMenu, false);
-   $("contactFolders").appendChild(li);
+   setEventsOnContactFolder(li);
 }
 
 function newAbCallback(http) {
@@ -458,7 +514,7 @@ function newAbCallback(http) {
      appendAddressBook(name, "/" + name);
   }
   else
-    log ("ajax fuckage 4:" + http.status);
+    log ("ajax problem 4:" + http.status);
 }
 
 function newUserFolderCallback(folderData) {
@@ -470,7 +526,7 @@ function newUserFolderCallback(folderData) {
 function onAddressBookAdd(event) {
    openUserFolderSelector(newUserFolderCallback, "contact");
 
-   event.preventDefault();
+   preventDefault(event);
 }
 
 function onFolderUnsubscribeCB(folderId) {
@@ -499,7 +555,7 @@ function onAddressBookRemove(event) {
      }
   }
 
-  event.preventDefault();
+  preventDefault(event);
 }
 
 function deletePersonalAddressBook(folderId) {
@@ -538,7 +594,7 @@ function deletePersonalAddressBookCallback(http) {
      document.deletePersonalABAjaxRequest = null;
   }
   else
-     log ("ajax fuckage");
+     log ("ajax problem 5: " + http.status);
 }
 
 function configureDragHandles() {
@@ -562,16 +618,14 @@ 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);
   }
 }
 
 function deniedFoldersLookupCallback(http) {
-   if (http.readyState == 4) { 
-      var denied = true;
-
-      if (http.status == 200)
-         denied = (http.responseText == "0");
+   if (http.readyState == 4) {
+      var denied = ! isHttpStatus204(http.status);
       var entry = $(http.callbackData);
       if (denied)
         entry.addClassName("denied");
@@ -583,56 +637,55 @@ function deniedFoldersLookupCallback(http) {
 function configureAbToolbar() {
   var toolbar = $("abToolbar");
   var links = toolbar.childNodesWithTag("a");
-  links[0].addEventListener("click", onAddressBookNew, false);
-  links[1].addEventListener("click", onAddressBookAdd, false);
-  links[2].addEventListener("click", onAddressBookRemove, false);
+  Event.observe(links[0], "click", onAddressBookNew, false);
+  Event.observe(links[1], "click", onAddressBookAdd, false);
+  Event.observe(links[2], "click", onAddressBookRemove, false);
 }
 
 function configureContactFolders() {
   var contactFolders = $("contactFolders");
   if (contactFolders) {
-    contactFolders.addEventListener("selectionchange",
-                                    onFolderSelectionChange, false);
+    Event.observe(contactFolders, "mousedown", listRowMouseDownHandler);
+    Event.observe(contactFolders, "click", onFolderSelectionChange);
     var lis = contactFolders.childNodesWithTag("li");
-    for (var i = 0; i < lis.length; i++) {
-      lis[i].addEventListener("mousedown", listRowMouseDownHandler, false);
-      lis[i].addEventListener("click", onRowClick, false);
-      lis[i].addEventListener("contextmenu", onContactFoldersContextMenu, false);
-    }
+    for (var i = 0; i < lis.length; i++)
+      setEventsOnContactFolder(lis[i]);
 
     lookupDeniedFolders();
-    contactFolders.style.visibility = "visible;";
 
     var personalFolder = $("/personal");
     personalFolder.select();
+    openContactsFolder("/personal");
   }
 }
 
-function onAccessRightsMenuEntryMouseUp(event) {
-  var folders = $("contactFolders");
-  var selected = folders.getSelectedNodes()[0];
-  var title = this.innerHTML;
-  var url = URLForFolderID(selected.getAttribute("id"))
-
-  openAclWindow(url + "/acls", title);
+function setEventsOnContactFolder(node) {
+   Event.observe(node, "mousedown", listRowMouseDownHandler, false);
+   Event.observe(node, "click", onRowClick, false);
+   Event.observe(node, "contextmenu",
+                onContactFoldersContextMenu.bindAsEventListener(node), false);
 }
 
-function initializeMenus() {
-  var menus = new Array("contactFoldersMenu", "contactMenu", "searchMenu");
-  initMenusNamed(menus);
+function onMenuSharing(event) {
+   var folders = $("contactFolders");
+   var selected = folders.getSelectedNodes()[0];
+   var title = this.innerHTML;
+   var url = URLForFolderID(selected.getAttribute("id"));
 
-  var menuEntry = $("accessRightsMenuEntry");
-  menuEntry.addEventListener("mouseup", onAccessRightsMenuEntryMouseUp, false);
+   openAclWindow(url + "/acls", title);
 }
 
-function configureSearchField() {
-   var searchValue = $("searchValue");
+function getMenus() {
+   var menus = {};
+   menus["contactFoldersMenu"] = new Array(null, "-", null,
+                                          null, "-", null, "-",
+                                          onMenuSharing);
+   menus["contactMenu"] = new Array(onMenuEditContact, "-",
+                                   onMenuWriteToContact, null, "-",
+                                   onMenuDeleteContact);
+   menus["searchMenu"] = new Array(setSearchCriteria);
 
-   searchValue.addEventListener("mousedown", onSearchMouseDown, false);
-   searchValue.addEventListener("click", popupSearchMenu, false);
-   searchValue.addEventListener("blur", onSearchBlur, false);
-   searchValue.addEventListener("focus", onSearchFocus, false);
-   searchValue.addEventListener("keydown", onSearchKeyDown, false);
+   return menus;
 }
 
 function configureSelectionButtons() {
@@ -640,22 +693,19 @@ function configureSelectionButtons() {
    if (container) {
       var buttons = container.childNodesWithTag("input");
       for (var i = 0; i < buttons.length; i++)
-        buttons[i].addEventListener("click", onConfirmContactSelection,
-                                    false);
+       Event.observe(buttons[i], "click",
+                     onConfirmContactSelection.bindAsEventListener(buttons[i]));
    }
 }
 
-var initContacts = {
-  handleEvent: function (event) {
-    if (!document.body.hasClassName("popup")) {
-      configureAbToolbar();
-      configureSearchField();
-    }
-    else
-      configureSelectionButtons();
-    configureContactFolders();
+function initContacts(event) {
+   if (!document.body.hasClassName("popup")) {
+     configureAbToolbar();
+   }
+   else
+     configureSelectionButtons();
+   configureContactFolders();
 //     initDnd();
-  }
 }
 
-window.addEventListener("load", initContacts, false);
+addEvent(window, 'load', initContacts);