From be2380fb47b05a222ec5b22deff36d5156a8c943 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Fri, 13 Jan 2006 13:08:41 -0500
Subject: [PATCH] Added labels for LDAP search

---
 program/js/app.js |  186 +++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 165 insertions(+), 21 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index dc0275c..ad91e1f 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -160,10 +160,15 @@
 
 
       case 'addressbook':
-        var contacts_list = this.gui_objects.contactslist;
+        var contacts_list      = this.gui_objects.contactslist;
+        var ldap_contacts_list = this.gui_objects.ldapcontactslist;
+
         if (contacts_list)
           this.init_contactslist(contacts_list);
       
+        if (ldap_contacts_list)
+          this.init_ldapsearchlist(ldap_contacts_list);
+
         this.set_page_buttons();
           
         if (this.env.cid)
@@ -173,6 +178,9 @@
           this.enable_command('save', true);
       
         this.enable_command('list', 'add', true);
+
+        this.enable_command('ldappublicsearch', this.env.ldappublicsearch);
+
         break;
 
 
@@ -224,8 +232,10 @@
       this.display_message(this.pending_message[0], this.pending_message[1]);
       
     // start interval for keep-alive/recent_check signal
-    if (this.kepp_alive_interval)
-      this.kepp_alive_int = setInterval(this.ref+'.'+(this.task=='mail'?'check_for_recent()':'send_keep_alive()'), this.kepp_alive_interval);
+    if (this.kepp_alive_interval && this.task=='mail' && this.gui_objects.messagelist)
+      this.kepp_alive_int = setInterval(this.ref+'.check_for_recent()', this.kepp_alive_interval);
+    else
+      this.kepp_alive_int = setInterval(this.ref+'.send_keep_alive()', this.kepp_alive_interval);
     };
 
 
@@ -369,6 +379,26 @@
     
     if (this.env.cid)
       this.select(this.env.cid);
+    };
+
+
+  // get all contact rows from HTML table and init each row
+  this.init_ldapsearchlist = function(ldap_contacts_list)
+    {
+    if (ldap_contacts_list && ldap_contacts_list.tBodies[0])
+      {
+      this.ldap_contact_rows = new Array();
+
+      var row;
+      for(var r=0; r<ldap_contacts_list.tBodies[0].childNodes.length; r++)
+        {
+        row = ldap_contacts_list.tBodies[0].childNodes[r];
+        this.init_table_row(row, 'ldap_contact_rows');
+        }
+      }
+
+    // alias to common rows array
+    this.list_rows = this.ldap_contact_rows;
     };
 
 
@@ -548,7 +578,15 @@
 
       case 'add':
         if (this.task=='addressbook')
-          this.load_contact(0, 'add');
+          if (!window.frames[this.env.contentframe].rcmail)
+            this.load_contact(0, 'add');
+          else
+            {
+            if (window.frames[this.env.contentframe].rcmail.selection.length)
+              this.add_ldap_contacts();
+            else
+              this.load_contact(0, 'add');
+            }
         else if (this.task=='settings')
           {
           this.clear_selection();
@@ -682,7 +720,8 @@
           this.show_message(this.env.prev_uid);
           //location.href = this.env.comm_path+'&_action=show&_uid='+this.env.prev_uid+'&_mbox='+this.env.mailbox;
         break;
-
+      
+      
       case 'compose':
         var url = this.env.comm_path+'&_action=compose';
         
@@ -699,21 +738,36 @@
           // get selected contacts
           else
             {
-            for (var n=0; n<this.selection.length; n++)
-              a_cids[a_cids.length] = this.selection[n];
+            if (!window.frames[this.env.contentframe].rcmail.selection.length)
+              {
+              for (var n=0; n<this.selection.length; n++)
+                a_cids[a_cids.length] = this.selection[n];
+              }
+            else
+              {
+              var frameRcmail = window.frames[this.env.contentframe].rcmail;
+              // get the email address(es)
+              for (var n=0; n<frameRcmail.selection.length; n++)
+                a_cids[a_cids.length] = frameRcmail.ldap_contact_rows[frameRcmail.selection[n]].obj.cells[1].innerHTML;
+              }
             }
-
           if (a_cids.length)
             url += '&_to='+a_cids.join(',');
           else
             break;
+            
           }
         else if (props)
            url += '&_to='+props;
+        
+        // don't know if this is necessary...
+        url = url.replace(/&_framed=1/, "");
 
         this.set_busy(true);
-        location.href = url;
-        break;      
+
+        // need parent in case we are coming from the contact frame
+        parent.window.location.href = url;
+        break;    
 
       case 'send':
         if (!this.gui_objects.messageform)
@@ -777,6 +831,15 @@
       case 'add-contact':
         this.add_contact(props);
         break;
+      
+
+      // ldap search
+      case 'ldappublicsearch':
+        if (this.gui_objects.ldappublicsearchform) 
+          this.gui_objects.ldappublicsearchform.submit();
+        else 
+          this.ldappublicsearch(command);
+        break; 
 
 
       // user settings commands
@@ -954,7 +1017,7 @@
   // onmouseup-handler of message list row
   this.click_row = function(e, id)
     {
-    var ctrl = this.check_ctrlkey(e);
+    var shift = this.check_shiftkey(e);
     
     // don't do anything (another action processed before)
     if (this.dont_select)
@@ -964,26 +1027,58 @@
       }
     
     if (!this.drag_active && this.in_selection_before==id)
-      this.select(id, (ctrl && this.task!='settings'));
+      {
+      this.select(id, (shift && this.task!='settings'));
+      }
     
     this.drag_start = false;
     this.in_selection_before = false;
         
     // row was double clicked
-    if (this.task=='mail' && this.list_rows && this.list_rows[id].clicked && !ctrl)
+    if (this.task=='mail' && this.list_rows && this.list_rows[id].clicked && !shift)
       {
       this.show_message(id);
       return false;
       }
     else if (this.task=='addressbook')
       {
-      if (this.selection.length==1 && this.env.contentframe)
+      if (this.contact_rows && this.selection.length==1)
+        {
         this.load_contact(this.selection[0], 'show', true);
-      else if (this.task=='addressbook' && this.list_rows && this.list_rows[id].clicked)
+        // change the text for the add contact button
+        var links = parent.document.getElementById('abooktoolbar').getElementsByTagName('A');
+        for (i = 0; i < links.length; i++)
+          {
+          var onclickstring = new String(links[i].onclick);
+          if (onclickstring.search('\"add\"') != -1)
+            links[i].title = this.env.newcontact;
+          }
+        }
+      else if (this.contact_rows && this.contact_rows[id].clicked)
         {
         this.load_contact(id, 'show');
         return false;
         }
+      else if (this.ldap_contact_rows && !this.ldap_contact_rows[id].clicked)
+        {
+        // clear selection
+        parent.rcmail.clear_selection();
+
+        // disable delete
+        parent.rcmail.set_button('delete', 'pas');
+
+        // change the text for the add contact button
+        var links = parent.document.getElementById('abooktoolbar').getElementsByTagName('A');
+        for (i = 0; i < links.length; i++)
+          {
+          var onclickstring = new String(links[i].onclick);
+          if (onclickstring.search('\"add\"') != -1)
+            links[i].title = this.env.addcontact;
+          }
+        }
+      // handle double click event
+      else if (this.ldap_contact_rows && this.selection.length==1 && this.ldap_contact_rows[id].clicked)
+        this.command('compose', this.ldap_contact_rows[id].obj.cells[1].innerHTML);
       else if (this.env.contentframe)
         {
         var elm = document.getElementById(this.env.contentframe);
@@ -1001,7 +1096,6 @@
       
     return false;
     };
-
 
 
 
@@ -1919,6 +2013,50 @@
 
     };
   
+  
+  // load ldap search form
+  this.ldappublicsearch = function(action)
+    {
+    var add_url = '';
+    var target = window;
+    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe])
+      {
+      add_url = '&_framed=1';
+      target = window.frames[this.env.contentframe];
+      document.getElementById(this.env.contentframe).style.visibility = 'inherit';
+      }
+    else
+      return false; 
+
+
+    if (action == 'ldappublicsearch')
+      target.location.href = this.env.comm_path+'&_action='+action+add_url;
+    };
+ 
+  // add ldap contacts to address book
+  this.add_ldap_contacts = function()
+    {
+    if (window.frames[this.env.contentframe].rcmail)
+      {
+      var frame = window.frames[this.env.contentframe];
+
+      // build the url
+      var url    = '&_framed=1';
+      var emails = '&_emails=';
+      var names  = '&_names=';
+      var end    = '';
+      for (var n=0; n<frame.rcmail.selection.length; n++)
+        {
+        end = n < frame.rcmail.selection.length - 1 ? ',' : '';
+        emails += frame.rcmail.ldap_contact_rows[frame.rcmail.selection[n]].obj.cells[1].innerHTML + end;
+        names  += frame.rcmail.ldap_contact_rows[frame.rcmail.selection[n]].obj.cells[0].innerHTML + end;
+        }
+       
+      frame.location.href = this.env.comm_path + '&_action=save&_framed=1' + emails + names;
+      }
+    return false;
+    }
+  
 
 
   /*********************************************************/
@@ -2572,8 +2710,8 @@
   console(request_obj.responseText);
 
     // if we get javascript code from server -> execute it
-    if (request_obj.responseText && (ctype=='text/javascript' || ctype=='application/x-javascript'))
-      eval(request_obj.responseText);
+    if (request_obj.get_text() && (ctype=='text/javascript' || ctype=='application/x-javascript'))
+      eval(request_obj.get_text());
 
     // process the response data according to the sent action
     switch (request_obj.__action)
@@ -2830,9 +2968,6 @@
 
     else if(this.xmlhttp.readyState == 4)
       {
-      this.responseText = this.xmlhttp.responseText;
-      this.responseXML = this.xmlhttp.responseXML;
-      
       if(this.xmlhttp.status == 0)
         this.onabort(this);
       else if(this.xmlhttp.status == 200)
@@ -2850,6 +2985,15 @@
     return this.xmlhttp.getResponseHeader(name);
     };
 
+  this.get_text = function()
+    {
+    return this.xmlhttp.responseText;
+    };
+
+  this.get_xml = function()
+    {
+    return this.xmlhttp.responseXML;
+    };
 
   this.reset();
   

--
Gitblit v1.9.1