From 24053e0d308d6c80149b812cda8774ed3d6ed71d Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 25 Jul 2006 18:11:50 -0400
Subject: [PATCH] Several bugfixes and improvements. See CHANGELOG for details

---
 program/localization/de_DE/messages.inc    |    2 
 CHANGELOG                                  |   13 +
 program/localization/de_CH/messages.inc    |    2 
 skins/default/templates/managefolders.html |   16 -
 program/lib/imap.inc                       |   19 +
 program/localization/de_CH/labels.inc      |    2 
 program/steps/settings/manage_folders.inc  |   54 +++-
 program/localization/de_DE/labels.inc      |    2 
 skins/default/images/icons/edit.png        |    0 
 skins/default/settings.css                 |   32 ++
 program/steps/mail/func.inc                |    3 
 program/localization/en_US/labels.inc      |    2 
 program/localization/es/labels.inc         |   66 +++--
 program/localization/es/messages.inc       |   24 +
 program/js/app.js                          |  326 ++++++++++++++++++++++++--------
 skins/default/addresses.css                |    2 
 16 files changed, 405 insertions(+), 160 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 28a0986..4d3bfa5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,19 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
+2006/07/25 (thomasb)
+----------
+- Made folder renaming a bit more ajax-style
+- Changed rename-labels and German translation
+- Fixed addressbox countbar width (Bug #1483845)
+- Fixed refresh interval problems in Safari (Bug #1483902) 
+- Fixed clear_message_list_header() errors (Bug #1483898)
+- Sanity check of $message_set in imap.inc (Bug #1443200)
+- Added correct changing of message list headers for Sent folder
+- Updated Spanish localization (Ticket #1483887)
+- Applied patch #1483846
+
+
 2006/07/24 (richs)
 ----------
 - Draft window no longer reloads. It saves to an iframe in the background instead (fixes bug #1483869)
diff --git a/program/js/app.js b/program/js/app.js
index a5ae90d..47545e2 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -13,6 +13,7 @@
  
   $Id$
 */
+
 // Constants
 var CONTROL_KEY = 1;
 var SHIFT_KEY = 2;
@@ -247,6 +248,9 @@
     document.onmousedown = function(){ return rcube_webmail_client.reset_click(); };
     document.onkeydown   = function(e){ return rcube_webmail_client.key_pressed(e, msg_list_frame); };
 
+    // set default keep alive interval
+    if (!this.keep_alive_interval)
+      this.keep_alive_interval = this._interval;
     
     // flag object as complete
     this.loaded = true;
@@ -256,23 +260,27 @@
       this.display_message(this.pending_message[0], this.pending_message[1]);
       
     // start interval for keep-alive/recent_check signal
-    if (this._interval && this.task=='mail' && this.gui_objects.messagelist)
+    if (this.keep_alive_interval && this.task=='mail' && this.gui_objects.messagelist)
       this._int = setInterval(this.ref+'.check_for_recent()', this.keep_alive_interval);
     else if (this.task!='login')
       this._int = setInterval(this.ref+'.send_keep_alive()', this.keep_alive_interval);
     };
 
   // reset last clicked if user clicks on anything other than the message table
-  this.reset_click = function() {
+  this.reset_click = function()
+    {
+    var id;
     this.in_message_list = false;
-	for (var n=0; n<this.selection.length; n++) {
+	for (var n=0; n<this.selection.length; n++)
+	  {
       id = this.selection[n];
-      if (this.list_rows[id].obj) {
+      if (this.list_rows[id] && this.list_rows[id].obj)
+        {
         this.set_classname(this.list_rows[id].obj, 'selected', false);
 		this.set_classname(this.list_rows[id].obj, 'unfocused', true);
-	  }
-    }
-  };
+        }
+      }
+    };
 	
   this.click_on_list = function(e)
     {
@@ -619,9 +627,10 @@
           if (this.env.search_request<0 || (this.env.search_request && props != this.env.mailbox))
             this.reset_qsearch();
 
-	  // Reset message list header, unless returning from compose/read/etc
-	  if (this.env.mailbox != props && this.message_rows)
-	    this.clear_message_list_header();
+          // Reset message list header, unless returning from compose/read/etc
+          // don't know what this is good for (thomasb, 2006/07/25)
+          //if (this.env.mailbox != props && this.message_rows)
+          //  this.clear_message_list_header();
 
           this.list_mailbox(props);
           }
@@ -645,7 +654,7 @@
           else
             sort_order = this.env.sort_order;
           }
-        
+
         if (this.env.sort_col==sort_col && this.env.sort_order==sort_order)
           break;
 
@@ -1406,7 +1415,9 @@
           }
       }
 	}
-	if (this.last_selected != 0) { this.set_classname(this.list_rows[this.last_selected].obj, 'focused', false);}
+	if (this.last_selected != 0 && this.list_rows[this.last_selected])
+	  this.set_classname(this.list_rows[this.last_selected].obj, 'focused', false);
+
     this.last_selected = id;
     this.set_classname(this.list_rows[id].obj, 'focused', true);        
   };
@@ -1596,18 +1607,24 @@
     
     };
 
+
   this.clear_message_list_header = function()
     {
-    var table = this.gui_objects.messagelist;
+    var table;
+    if (table = this.gui_objects.messagelist)
+      {
+      if (table.colgroup)
+        table.removeChild(table.colgroup);
+      if (table.tHead)
+        table.removeChild(table.tHead);
 
-    var colgroup = document.createElement('COLGROUP');
-    table.removeChild(table.colgroup);
-    table.insertBefore(colgroup, table.thead);
-
-    var thead = document.createElement('THEAD');
-    table.removeChild(table.thead);
-    table.insertBefore(thead, table.tBodies[0]);
+      var colgroup = document.createElement('COLGROUP');
+      var thead = document.createElement('THEAD');
+      table.insertBefore(colgroup, table.tBodies[0]);
+      table.insertBefore(thead, table.tBodies[0]);
+      }
     };
+
 
   this.expunge_mailbox = function(mbox)
     {
@@ -2640,8 +2657,12 @@
     };
 
 
+  // tell server to create and subscribe a new mailbox
   this.create_folder = function(name)
     {
+	if (this.edit_folder)
+	  this.reset_folder_rename();
+
     var form;
     if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
       name = form.elements['_folder_name'].value;
@@ -2652,37 +2673,192 @@
       form.elements['_folder_name'].focus();
     };
 
+
+  // entry point for folder renaming
   this.rename_folder = function(props)
     {
-    var form;
-    if ((form = this.gui_objects.editform) && form.elements['_folder_oldname'] && form.elements['_folder_newname'])
-      {	
+    var form, oldname, newname;
+    
+    // rename a specific mailbox
+    if (props)
+      this.edit_foldername(props);
+
+    // use a dropdown and input field (old behavior)
+    else if ((form = this.gui_objects.editform) && form.elements['_folder_oldname'] && form.elements['_folder_newname'])
+      {
       oldname = form.elements['_folder_oldname'].value;
       newname = form.elements['_folder_newname'].value;
       }
 
     if (oldname && newname)
       this.http_request('rename-folder', '_folder_oldname='+escape(oldname)+'&_folder_newname='+escape(newname));
-
     };
 
 
-  this.delete_folder = function(folder)
+  // start editing the mailbox name.
+  // this will replace the name string with an input field
+  this.edit_foldername = function(folder)
     {
-    if (folder)
+    var temp, row, form;
+    var id = this.get_folder_row_id(folder);
+
+    // reset current renaming
+	if (temp = this.edit_folder)
+	  {
+	  this.reset_folder_rename();
+	  if (temp == id)
+	    return;
+	  }
+
+    if (id && (row = document.getElementById(id)))
       {
-      this.http_request('delete-folder', '_mboxes='+escape(folder));
+      this.name_input = document.createElement('INPUT');
+      this.name_input.value = this.env.subscriptionrows[id];
+      this.name_input.style.width = '100%';
+      this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
+      
+      row.cells[0].replaceChild(this.name_input, row.cells[0].firstChild);
+      this.edit_folder = id;
+      this.name_input.select();
+      
+      if (form = this.gui_objects.editform)
+        form.onsubmit = function(){ return false; };
       }
     };
 
 
-  this.remove_folder_row = function(folder)
+  // remove the input field and write the current mailbox name to the table cell
+  this.reset_folder_rename = function()
     {
-    for (var id in this.env.subscriptionrows)
-      if (this.env.subscriptionrows[id]==folder)
+    var cell = this.name_input ? this.name_input.parentNode : null;
+    if (cell && this.edit_folder)
+      cell.innerHTML = this.env.subscriptionrows[this.edit_folder];
+      
+    this.edit_folder = null;
+    };
+
+
+  // handler for keyboard events on the input field
+  this.name_input_keypress = function(e)
+    {
+    var key = document.all ? event.keyCode : document.getElementById ? e.keyCode : 0;
+
+    // enter
+    if (key==13)
+      {
+      var newname = this.name_input ? this.name_input.value : null;
+      if (this.edit_folder && newname)
+        this.http_request('rename-folder', '_folder_oldname='+escape(this.env.subscriptionrows[this.edit_folder])+'&_folder_newname='+escape(newname));        
+      }
+    // escape
+    else if (key==27)
+      this.reset_folder_rename();
+    };
+
+
+  // delete a specific mailbox with all its messages
+  this.delete_folder = function(folder)
+    {
+	if (this.edit_folder)
+	  this.reset_folder_rename();
+    
+    if (folder)
+      this.http_request('delete-folder', '_mboxes='+escape(folder));
+    };
+
+
+  // add a new folder to the subscription list by cloning a folder row
+  this.add_folder_row = function(name, replace)
+    {
+    name = name.replace('\\',"");
+    if (!this.gui_objects.subscriptionlist)
+      return false;
+
+    for (var refid in this.env.subscriptionrows)
+      if (this.env.subscriptionrows[refid]!=null)
         break;
 
+    var refrow, form;
+    var tbody = this.gui_objects.subscriptionlist.tBodies[0];
+    var id = replace && replace.id ? replace.id : tbody.childNodes.length+1;
+
+    if (!id || !(refrow = document.getElementById(refid)))
+      {
+      // Refresh page if we don't have a table row to clone
+      location.href = this.env.comm_path+'&_action=folders';
+      }
+    else
+      {
+      // clone a table row if there are existing rows
+      var row = this.clone_table_row(refrow);
+      row.id = 'rcmrow'+id;
+      if (replace)
+        tbody.replaceChild(row, replace);
+      else
+        tbody.appendChild(row);
+      }
+
+    // add to folder/row-ID map
+    this.env.subscriptionrows[row.id] = name;
+
+    // set folder name
+    row.cells[0].innerHTML = name;
+    if (row.cells[1] && row.cells[1].firstChild.tagName=='INPUT')
+      {
+      row.cells[1].firstChild.value = name;
+      row.cells[1].firstChild.checked = true;
+      }
+       
+    if (row.cells[2] && row.cells[2].firstChild.tagName=='A')
+      row.cells[2].firstChild.onclick = new Function(this.ref+".command('rename-folder','"+name.replace('\'','\\\'')+"')");
+    if (row.cells[3] && row.cells[3].firstChild.tagName=='A')
+      row.cells[3].firstChild.onclick = new Function(this.ref+".command('delete-folder','"+name.replace('\'','\\\'')+"')");
+
+    // add new folder to rename-folder list and clear input field
+    if (!replace && (form = this.gui_objects.editform) && form.elements['_folder_name'])
+      {
+      form.elements['_folder_oldname'].options[form.elements['_folder_oldname'].options.length] = new Option(name,name);
+      form.elements['_folder_name'].value = ''; 
+      }
+
+    };
+
+
+  // replace an existing table row with a new folder line
+  this.replace_folder_row = function(newfolder, oldfolder)
+    {
+    var id = this.get_folder_row_id(oldfolder);
+    var row = document.getElementById(id);
+    
+    // replace an existing table row (if found)
+    this.add_folder_row(newfolder, row);
+    this.env.subscriptionrows[id] = null;
+    
+    // rename folder in rename-folder dropdown
+    var form, elm;
+    if ((form = this.gui_objects.editform) && (elm = form.elements['_folder_oldname']))
+      {
+      for (var i=0;i<elm.options.length;i++)
+        {
+        if (elm.options[i].value == oldfolder)
+          {
+          elm.options[i].text = newfolder;
+          elm.options[i].value = newfolder;
+          break;
+          }
+        }
+
+      form.elements['_folder_newname'].value = '';
+      }
+    };
+    
+
+  // remove the table row of a specific mailbox from the table
+  // (the row will not be removed, just hidden)
+  this.remove_folder_row = function(folder)
+    {
     var row;
+    var id = this.get_folder_row_id(folder);
     if (id && (row = document.getElementById(id)))
       row.style.display = 'none';    
 
@@ -2693,13 +2869,14 @@
       for (var i=0;i<form.elements['_folder_oldname'].options.length;i++)
         {
         if (form.elements['_folder_oldname'].options[i].value == folder) 
-	  {
+          {
           form.elements['_folder_oldname'].options[i] = null;
-	  break;
+          break;
           }
         }
       }
-      form.elements['_folder_newname'].value='';
+    
+    form.elements['_folder_newname'].value = '';
     };
 
 
@@ -2759,52 +2936,15 @@
       
     };
 
-
-   // add a new folder to the subscription list by cloning a folder row
-   this.add_folder_row = function(name)
-     {
-     name = name.replace('\\',"");
-     if (!this.gui_objects.subscriptionlist)
-       return false;
-
-     var tbody = this.gui_objects.subscriptionlist.tBodies[0];
-     var id = tbody.childNodes.length+1;
-   
-     if (!tbody.rows[0]) 
-       {
-       // Refresh to create the first table row
-       location.href = this.env.comm_path+'&_action=folders';
-       }
-     else
-       {
-       // clone a table row if there are existing rows
-       var row = this.clone_table_row(tbody.rows[0]);
-       row.id = 'rcmrow'+id;
-       tbody.appendChild(row);
-       }
-
-     // add to folder/row-ID map
-     this.env.subscriptionrows[row.id] = name;
-
-     // set folder name
-     row.cells[0].innerHTML = name;
-     if (row.cells[1].firstChild.tagName=='INPUT')
-       {
-       row.cells[1].firstChild.value = name;
-       row.cells[1].firstChild.checked = true;
-       }
-     if (row.cells[2].firstChild.tagName=='A')
-       row.cells[2].firstChild.onclick = new Function(this.ref+".command('delete-folder','"+name.replace('\'','\\\'')+"')");
-
-     var form;
-     if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
-       form.elements['_folder_name'].value = '';
- 
-     // add new folder to rename-folder list
-     form.elements['_folder_oldname'].options[form.elements['_folder_oldname'].options.length] = new Option(name,name);
-
-     };
-
+  // helper method to find a specific mailbox row ID
+  this.get_folder_row_id = function(folder)
+    {
+    for (var id in this.env.subscriptionrows)
+      if (this.env.subscriptionrows[id]==folder)
+        break;
+        
+    return id;
+    };
 
   // duplicate a specific table row
   this.clone_table_row = function(row)
@@ -3033,11 +3173,35 @@
     this.env.mailbox = mbox;
     };
 
+
   // for reordering column array, Konqueror workaround
   this.set_message_coltypes = function(coltypes) 
   { 
-  this.coltypes = coltypes; 
-  }
+    this.coltypes = coltypes;
+    
+    // set correct list titles
+    var cell, col;
+    var thead = this.gui_objects.messagelist ? this.gui_objects.messagelist.tHead : null;
+    for (var n=0; thead && n<this.coltypes.length; n++) 
+      {
+      col = this.coltypes[n];
+      if ((cell = thead.rows[0].cells[n+1]) && (col=='from' || col=='to'))
+        {
+        // if we have links for sorting, it's a bit more complicated...
+        if (cell.firstChild && cell.firstChild.tagName=='A')
+          {
+          cell.firstChild.innerHTML = this.get_label(this.coltypes[n]);
+          cell.firstChild.onclick = function(){ return rcmail.command('sort', this.__col, this); };
+          cell.firstChild.__col = col;
+          }
+        else
+          cell.innerHTML = this.get_label(this.coltypes[n]);
+
+        cell.id = 'rcmHead'+col;
+        }
+      }
+
+  };
 
   // create a table row in the message list
   this.add_message_row = function(uid, cols, flags, attachment, attop)
diff --git a/program/lib/imap.inc b/program/lib/imap.inc
index 5251f84..2c07f34 100644
--- a/program/lib/imap.inc
+++ b/program/lib/imap.inc
@@ -45,6 +45,7 @@
 		- Added function iil_C_ID2UID()
 		- Casting date parts in iil_StrToTime() to avoid mktime() warnings
 		- Also acceppt LIST responses in iil_C_ListSubscribed()
+		- Sanity check of $message_set in iil_C_FetchHeaders(), iil_C_FetchHeaderIndex(), iil_C_FetchThreadHeaders()
 		- Removed some debuggers (echo ...)
 
 ********************************************************/
@@ -676,7 +677,9 @@
 	if (empty($index_field)) $index_field="DATE";
 	$index_field = strtoupper($index_field);
 	
-	if ((empty($message_set)) || ($message_set == "1:0")) return array();
+	list($from_idx, $to_idx) = explode(':', $message_set);
+	if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+		return false;
 	
 	//$fields_a["DATE"] = ($IMAP_USE_INTERNAL_DATE?6:1);
 	$fields_a['DATE'] = 1;
@@ -932,7 +935,9 @@
 	global $clock;
 	global $index_a;
 	
-	if (empty($message_set)) return false;
+	list($from_idx, $to_idx) = explode(':', $message_set);
+	if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+		return false;
 
 	$result = array();
 	$uids = iil_C_FetchUIDs($conn, $mailbox);
@@ -1013,7 +1018,9 @@
 function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock){
 	global $index_a;
 
-	if (empty($message_set)) return false;
+	list($from_idx, $to_idx) = explode(':', $message_set);
+	if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+		return false;
 	
 	$result=array();
 	$roots=array();
@@ -1195,8 +1202,10 @@
 	$result=array();
 	$fp = $conn->fp;
 	
-	if (empty($message_set)) return array();
-	
+	list($from_idx, $to_idx) = explode(':', $message_set);
+	if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+		return false;
+		
 	/*  Do "SELECT" command */
 	if (!iil_C_Select($conn, $mailbox)){
 		$conn->error = "Couldn't select $mailbox";
diff --git a/program/localization/de_CH/labels.inc b/program/localization/de_CH/labels.inc
index 2b73ed0..d4a467d 100644
--- a/program/localization/de_CH/labels.inc
+++ b/program/localization/de_CH/labels.inc
@@ -206,6 +206,8 @@
 $labels['subscribed']  = 'Abonniert';
 $labels['create']      = 'Erstellen';
 $labels['createfolder']  = 'Neuen Ordner erstellen';
+$labels['rename'] = 'Umbenennen';
+$labels['renamefolder'] = 'Ordner umbenennen';
 $labels['deletefolder']  = 'Ordner löschen';
 $labels['managefolders']  = 'Ordner verwalten';
 
diff --git a/program/localization/de_CH/messages.inc b/program/localization/de_CH/messages.inc
index 0484b5d..d3314a9 100644
--- a/program/localization/de_CH/messages.inc
+++ b/program/localization/de_CH/messages.inc
@@ -34,7 +34,7 @@
 
 $messages['loading'] = $messages['loadingdata'] = 'Daten werden geladen...';
 
-$messages['checkingmail'] = 'Überprüfung auf neue Anzeigen...';
+$messages['checkingmail'] = 'Überprüfung auf neue Nachrichten...';
 
 $messages['sendingmessage'] = 'Nachricht wird gesendet...';
 
diff --git a/program/localization/de_DE/labels.inc b/program/localization/de_DE/labels.inc
index 1aab071..f1cef48 100644
--- a/program/localization/de_DE/labels.inc
+++ b/program/localization/de_DE/labels.inc
@@ -207,6 +207,8 @@
 $labels['subscribed']  = 'Abonniert';
 $labels['create']      = 'Erstellen';
 $labels['createfolder']  = 'Neuen Ordner erstellen';
+$labels['rename'] = 'Umbenennen';
+$labels['renamefolder'] = 'Ordner umbenennen';
 $labels['deletefolder']  = 'Ordner löschen';
 $labels['managefolders']  = 'Ordner verwalten';
 
diff --git a/program/localization/de_DE/messages.inc b/program/localization/de_DE/messages.inc
index f084b16..c6ca701 100644
--- a/program/localization/de_DE/messages.inc
+++ b/program/localization/de_DE/messages.inc
@@ -36,7 +36,7 @@
 
 $messages['loading'] = $messages['loadingdata'] = 'Daten werden geladen...';
 
-$messages['checkingmail'] = 'Überprüfung auf neue Anzeigen...';
+$messages['checkingmail'] = 'Überprüfung auf neue Nachrichten...';
 
 $messages['sendingmessage'] = 'Nachricht wird gesendet...';
 
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 436dacf..2170131 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -210,7 +210,7 @@
 $labels['create']  = 'Create';
 $labels['createfolder']  = 'Create new folder';
 $labels['rename'] = 'Rename';
-$labels['renamefolder'] = 'Rename existing folder';
+$labels['renamefolder'] = 'Rename folder';
 $labels['deletefolder']  = 'Delete folder';
 $labels['managefolders']  = 'Manage folders';
 
diff --git a/program/localization/es/labels.inc b/program/localization/es/labels.inc
index 3b28244..b543022 100644
--- a/program/localization/es/labels.inc
+++ b/program/localization/es/labels.inc
@@ -16,7 +16,7 @@
  |  - 6/2/2006 Translations of new features and improvements)            |
  |  - 17/9/2005 First release                                            |
  +-----------------------------------------------------------------------+
- 
+
  $Id$
 
 */
@@ -24,6 +24,7 @@
 $labels = array();
 
 // login page
+$labels['welcome']   = 'Bienvenido a $product';
 $labels['username']  = 'Nombre de usuario';
 $labels['password']  = 'Contraseña';
 $labels['server']    = 'Servidor';
@@ -37,18 +38,17 @@
 
 // mailbox names
 $labels['inbox']  = 'Entrada';
-$labels['drafts'] = 'Bosquejos';
+$labels['drafts'] = 'Borradores';
 $labels['sent']   = 'Enviados';
 $labels['trash']  = 'Papelera';
-$labels['drafts'] = 'Borradores';
 $labels['junk']   = 'Basura';
 
 // message listing
 $labels['subject'] = 'Asunto';
 $labels['from']    = 'Remitente';
 $labels['to']      = 'Destinatario';
-$labels['cc']      = 'CC';
-$labels['bcc']     = 'BCC';
+$labels['cc']      = 'Copia';
+$labels['bcc']     = 'Bcc';
 $labels['replyto'] = 'Responder';
 $labels['date']    = 'Fecha';
 $labels['size']    = 'Tamaño';
@@ -70,17 +70,18 @@
 
 $labels['preferhtml'] = 'Prefiero HTML';
 $labels['htmlmessage'] = 'Mensaje HTML';
+$labels['prettydate'] = 'Fecha detallada';
 
 $labels['addtoaddressbook'] = 'Añadir a contactos';
 
 // weekdays short
-$labels['sun'] = 'D';
-$labels['mon'] = 'L';
-$labels['tue'] = 'M';
-$labels['wed'] = 'X';
-$labels['thu'] = 'J';
-$labels['fri'] = 'V';
-$labels['sat'] = 'S';
+$labels['sun'] = 'Dom';
+$labels['mon'] = 'Lun';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mie';
+$labels['thu'] = 'Jue';
+$labels['fri'] = 'Vie';
+$labels['sat'] = 'Sáb';
 
 // weekdays long
 $labels['sunday']    = 'Domingo';
@@ -94,11 +95,12 @@
 $labels['today'] = 'Hoy';
 
 // toolbar buttons
-$labels['checkmail']        = 'Comprobación para saber si hay nuevos mensajes';
+$labels['checkmail']        = 'Revisar si hay nuevos mensajes';
 $labels['writenewmessage']  = 'Crear nuevo mensaje';
 $labels['replytomessage']   = 'Responder al mensaje';
+$labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
 $labels['forwardmessage']   = 'Reenviar mensaje';
-$labels['deletemessage']    = 'Move message to trash';
+$labels['deletemessage']    = 'Mover mensaje a la papelera';
 $labels['printmessage']     = 'Imprimir este mensaje';
 $labels['previousmessages'] = 'Mostrar mensajes anteriores';
 $labels['nextmessages']     = 'Mostrar mensajes siguientes';
@@ -116,19 +118,28 @@
 $labels['purge'] = 'Eliminar';
 
 $labels['quota'] = 'Uso de disco';
+$labels['unknown']  = 'desconocido';
+$labels['unlimited']  = 'sin límite';
+
+$labels['quicksearch']  = 'Búsqueda rápida';
+$labels['resetsearch']  = 'Reajustar la búsqueda';
 
 
 // message compose
 $labels['compose']  = 'Escribir un mensaje';
-$labels['savemessage']  = 'Excepto este bosquejo';
+$labels['savemessage']  = 'Almacenar como borrador';
 $labels['sendmessage']  = 'Enviar ahora el mensaje';
 $labels['addattachment']  = 'Añadir un fichero';
 $labels['charset']  = 'Codigo';
+$labels['returnreceipt'] = 'Recibo de entrega';
+
+$labels['checkspelling'] = 'Revisar la ortografía';
+$labels['resumeediting'] = 'Continuar el editaje';
+$labels['revertto'] = 'Revertir a';
 
 $labels['attachments'] = 'Adjuntos';
 $labels['upload'] = 'Subir';
 $labels['close']  = 'Cerrar';
-
 
 $labels['low']     = 'Bajo';
 $labels['lowest']  = 'Bajísimo';
@@ -136,7 +147,6 @@
 $labels['high']    = 'Alto';
 $labels['highest'] = 'Altísimo';
 
-$labels['showimages'] = 'Mostrar imágenes';
 
 $labels['nosubject']  = '(sin asunto)';
 $labels['showimages'] = 'Mostrar imágenes';
@@ -148,25 +158,27 @@
 $labels['surname']   = 'Apellido';
 $labels['email']     = 'E-Mail';
 
-$labels['addcontact'] = 'Añadir nuevo contacto';
-$labels['editcontact'] = 'Editar contacto';
-
 $labels['edit']   = 'Editar';
 $labels['cancel'] = 'Cancelar';
-$labels['save']   = 'Salvar';
+$labels['save']   = 'Almacenar';
 $labels['delete'] = 'Eliminar';
 
 $labels['newcontact']     = 'Crear nuevo contacto';
+$labels['addcontact']     = 'Añadir nuevo contacto';
+$labels['editcontact']    = 'Editar contacto';
 $labels['deletecontact']  = 'Eliminar contactos seleccionados';
 $labels['composeto']      = 'Redactar correo a';
 $labels['contactsfromto'] = 'Contactos $from a $to de $count';
 $labels['print']          = 'Imprimir';
 $labels['export']         = 'Exportar';
 
+$labels['previouspage']   = 'Mostrar grupo anterior';
+$labels['nextpage']       = 'Mostrar grupo siguiente';
+
 // LDAP search
 $labels['ldapsearch'] = 'Búsqueda en el directorio LDAP';
 
-$labels['ldappublicsearchname']    = 'Nombre';
+$labels['ldappublicsearchname'] = 'Nombre';
 $labels['ldappublicsearchtype'] = '¿Búsqueda exacta?';
 $labels['ldappublicserverselect'] = 'Elegir servidores';
 $labels['ldappublicsearchfield'] = 'Buscando';
@@ -192,16 +204,17 @@
 $labels['language']  = 'Idioma';
 $labels['timezone']  = 'Zona horaria';
 $labels['pagesize']  = 'Filas por página';
-
 $labels['signature'] = 'Firma';
+$labels['dstactive']  = 'Cambio de horario';
 
 $labels['folder']  = 'Carpeta';
-
 $labels['folders']  = 'Carpetas';
 $labels['foldername']  = 'Nombre de carpeta';
 $labels['subscribed']  = 'Suscribirse';
 $labels['create']  = 'Crear';
 $labels['createfolder']  = 'Crear nueva carpeta';
+$labels['rename'] = 'Renombrar';
+$labels['renamefolder'] = 'Renombrar carpeta';
 $labels['deletefolder']  = 'Eliminar carpeta';
 $labels['managefolders']  = 'Gestionar carpetas';
 
@@ -209,7 +222,4 @@
 $labels['sortasc']  = 'Orden ascendente';
 $labels['sortdesc'] = 'Orden descendente';
 
-$labels['prettydate']  = 'Formato de fecha';
-$labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
-
-?>
+?>
\ No newline at end of file
diff --git a/program/localization/es/messages.inc b/program/localization/es/messages.inc
index 675bc84..865807d 100644
--- a/program/localization/es/messages.inc
+++ b/program/localization/es/messages.inc
@@ -17,7 +17,7 @@
  |  - 17/9/2005 First release                                            |
  +-----------------------------------------------------------------------+
 
- 
+
  $Id$
 
 */
@@ -43,17 +43,17 @@
 
 $messages['loadingdata'] = 'Cargando datos...';
 
-$messages['checkingmail'] = 'Comprobación para saber si hay nuevos mensajes...';
+$messages['checkingmail'] = 'Verificar si hay nuevos mensajes...';
 
 $messages['sendingmessage'] = 'Enviando mensaje...';
 
 $messages['messagesent'] = 'Mensaje enviado correctamente';
 
-$messages['savingmessage'] = 'Mensaje del ahorro...';
+$messages['savingmessage'] = 'Guardar mensaje...';
 
-$messages['messagesaved'] = 'Mensaje ahorrado a los bosquejos';
+$messages['messagesaved'] = 'Mensaje guardado en los bosquejos';
 
-$messages['successfullysaved'] = 'guardado correctamente';
+$messages['successfullysaved'] = 'Guardado correctamente';
 
 $messages['addedsuccessfully'] = 'Contacto añadido correctamente a la libreta de direcciones';
 
@@ -89,7 +89,7 @@
 
 $messages['norecipientwarning'] = 'Por favor, introduzca al menos un destinatario';
 
-$messages['nosubjectwarning']  = 'El campo "asunto" esta vacio. ¿Desea introducir el campo "asunto" al mensaje?';
+$messages['nosubjectwarning']  = 'El campo "Asunto" esta vacio. ¿Desea redactarlo en este momento?';
 
 $messages['nobodywarning'] = '¿Quiere enviar este mensaje sin texto?';
 
@@ -101,4 +101,14 @@
 
 $messages['nosearchname'] = 'Por favor, introduzca un nombre o la dirección email';
 
-?>
+$messages['searchsuccessful'] = 'Se encontró $nr mensajes';
+
+$messages['searchnomatch'] = 'La busqueda no obtuvo resultados';
+
+$messages['searching'] = 'Buscando...';
+
+$messages['checking'] = 'Revisando...';
+
+$messages['nospellerrors'] = 'No se encontró errores ortográficos';
+
+?>
\ No newline at end of file
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 376c0bf..b1d3d8b 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -289,6 +289,9 @@
   // check to see if we have some settings for sorting
   $sort_col   = $_SESSION['sort_col'];
   $sort_order = $_SESSION['sort_order'];
+  
+  // add some labels to client
+  rcube_add_label('from', 'to');
 
   // get message headers
   $a_headers = $IMAP->list_headers('', '', $sort_col, $sort_order);
diff --git a/program/steps/settings/manage_folders.inc b/program/steps/settings/manage_folders.inc
index 7274bdc..770bac2 100644
--- a/program/steps/settings/manage_folders.inc
+++ b/program/steps/settings/manage_folders.inc
@@ -71,13 +71,15 @@
 
   if ($rename && $REMOTE_REQUEST)
     {
-    $commands = sprintf("this.add_folder_row('%s');\n", addslashes(rep_specialchars_output($rename, 'js'))); 
-    $commands .= sprintf("this.remove_folder_row('%s');", rep_specialchars_output($_GET['_folder_oldname'], 'js'));
+    $commands = sprintf("this.replace_folder_row('%s','%s');",
+                        addslashes(rep_specialchars_output($rename, 'js')),
+                        rep_specialchars_output($_GET['_folder_oldname'], 'js'));
     rcube_remote_response($commands);
     }
   else if (!$rename && $REMOTE_REQUEST)
     {
-    $commands = show_message('errorsaving', 'error');
+    $commands = "this.reset_folder_rename();\n";
+    $commands .= show_message('errorsaving', 'error');
     rcube_remote_response($commands);
     }
   else if (!$rename)
@@ -121,7 +123,10 @@
 
   // add table header
   $out .= "<thead><tr>\n";
-  $out .= sprintf('<td>%s</td><td>%s</td><td></td>', rcube_label('foldername'), rcube_label('subscribed'));
+  $out .= sprintf('<td class="name">%s</td><td class="subscribed">%s</td>'.
+                  '<td class="rename">&nbsp;</td><td class="delete">&nbsp;</td>',
+                  rcube_label('foldername'), rcube_label('subscribed'));
+                  
   $out .= "\n</tr></thead>\n<tbody>\n";
 
 
@@ -132,31 +137,46 @@
  
   $checkbox_subscribe = new checkbox(array('name' => '_subscribed[]', 'onclick' => "$JS_OBJECT_NAME.command(this.checked?'subscribe':'unsubscribe',this.value)"));
   
-  if ($attrib['deleteicon'])
-    $button = sprintf('<img src="%s%s" alt="%s" border="0" />', $CONFIG['skin_path'], $attrib['deleteicon'], rcube_label('delete'));
+  if (!empty($attrib['deleteicon']))
+    $del_button = sprintf('<img src="%s%s" alt="%s" border="0" />', $CONFIG['skin_path'], $attrib['deleteicon'], rcube_label('delete'));
   else
-    $button = rcube_label('delete');
+    $del_button = rcube_label('delete');
 
+  if (!empty($attrib['renameicon']))
+    $edit_button = sprintf('<img src="%s%s" alt="%s" border="0" />', $CONFIG['skin_path'], $attrib['renameicon'], rcube_label('rename'));
+  else
+    $del_button = rcube_label('rename');
 
   // create list of available folders
   foreach ($a_unsubscribed as $i => $folder)
     {
-    if ($CONFIG['protect_default_folders'] == TRUE && in_array($folder,$CONFIG['default_imap_folders']))
-      continue;
-
+    $protected = ($CONFIG['protect_default_folders'] == TRUE && in_array($folder,$CONFIG['default_imap_folders']));
     $zebra_class = $i%2 ? 'even' : 'odd';
     $folder_js = rep_specialchars_output($folder, 'js');
-    $a_js_folders['rcmrow'.($i+1)] = $folder_js;
+    
+    if (!$protected)
+      $a_js_folders['rcmrow'.($i+1)] = $folder_js;
 
-    $out .= sprintf('<tr id="rcmrow%d" class="%s"><td>%s</td><td>%s</td><td><a href="#delete" onclick="%s.command(\'delete-folder\',\'%s\')" title="%s">%s</a></td>',
+    $out .= sprintf('<tr id="rcmrow%d" class="%s"><td>%s</td><td>%s</td>',
                     $i+1,
                     $zebra_class,
                     rep_specialchars_output(rcube_charset_convert($folder, 'UTF-7', 'UTF-8'), 'html', 'all'),
-                    $checkbox_subscribe->show(in_array($folder, $a_subscribed)?$folder:'', array('value' => $folder)),
-                    $JS_OBJECT_NAME,
-                    $folder_js,
-                    rcube_label('deletefolder'),
-                    $button);
+                    $checkbox_subscribe->show(in_array($folder, $a_subscribed)?$folder:'', array('value' => $folder, 'disabled' => $protected)));
+
+    // add rename and delete buttons
+    if (!$protected)
+      $out .= sprintf('<td><a href="#rename" onclick="%s.command(\'rename-folder\',\'%s\')" title="%s">%s</a>'.
+                      '<td><a href="#delete" onclick="%s.command(\'delete-folder\',\'%s\')" title="%s">%s</a></td>',
+                      $JS_OBJECT_NAME,
+                      $folder_js,
+                      rcube_label('renamefolder'),
+                      $edit_button,
+                      $JS_OBJECT_NAME,
+                      $folder_js,
+                      rcube_label('deletefolder'),
+                      $del_button);
+    else
+      $out .= '<td></td><td></td>';
     
     $out .= "</tr>\n";
     }
diff --git a/skins/default/addresses.css b/skins/default/addresses.css
index a0fb15c..5bb6c61 100644
--- a/skins/default/addresses.css
+++ b/skins/default/addresses.css
@@ -19,7 +19,7 @@
   position: absolute;
   top: 60px;
   left: 490px;
-  width: 200px;
+  width: 240px;
   height: 20px;
   text-align: left;
 }
diff --git a/skins/default/images/icons/edit.png b/skins/default/images/icons/edit.png
new file mode 100644
index 0000000..9b40b5c
--- /dev/null
+++ b/skins/default/images/icons/edit.png
Binary files differ
diff --git a/skins/default/settings.css b/skins/default/settings.css
index fe6a589..c172576 100644
--- a/skins/default/settings.css
+++ b/skins/default/settings.css
@@ -67,6 +67,15 @@
   left: 20px;
 }
 
+#folder-manager
+{
+  width: 500px;
+  bottom: 120px;
+  overflow: auto;
+  border: 1px solid #999999;
+  height: expression((parseInt(document.documentElement.clientHeight)-215)+'px');
+}
+
 #identities-table
 {
   width: 500px;
@@ -101,6 +110,15 @@
   padding-right: 10px;
 }
 
+#bottomboxes
+{
+  position: absolute;
+  width: 500px;
+  height: 100px;
+  left: 20px;
+  bottom: 20px;
+}
+
 #userprefs-title,
 #identity-title,
 div.boxtitle,
@@ -132,8 +150,8 @@
 
 #subscription-table
 {
-  width: 500px;
-  border: 1px solid #999999;
+  width: 100%;
+  table-layout: fixed;
 }
 
 #subscription-table tbody td
@@ -145,10 +163,12 @@
   background-color: #F9F9F9;
 }
 
-/*
-#subscription-table tbody td select
+#subscription-table td.name
 {
-  width: 150px;
+  width: 280px;
 }
-*/
 
+#subscription-table td.subscribed
+{
+  width: 80px;
+}
diff --git a/skins/default/templates/managefolders.html b/skins/default/templates/managefolders.html
index a94d738..d378619 100644
--- a/skins/default/templates/managefolders.html
+++ b/skins/default/templates/managefolders.html
@@ -16,9 +16,11 @@
 <div id="folder-manager">
 <roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table"
   cellpadding="1" cellspacing="0" summary="Folder subscription table"
-  deleteIcon="/images/icons/folder-trash.png" />
+  deleteIcon="/images/icons/folder-trash.png"
+  renameIcon="/images/icons/edit.png" />
+</div>
 
-
+<div id="bottomboxes">
 <div class="settingsbox">
 <div class="boxtitle"><roundcube:label name="createfolder" /></div>
 
@@ -26,16 +28,6 @@
 <roundcube:label name="foldername" />:&nbsp;
 <roundcube:object name="createfolder" form="subscriptionform" />
 <roundcube:button command="create-folder" type="input" class="button" label="create" />
-</div>
-</div>
-
-<div class="settingsbox">
-<div class="boxtitle"><roundcube:label name="renamefolder" /></div>
-
-<div class="settingspart">
-<roundcube:label name="foldername" />:&nbsp;
-<roundcube:object name="renamefolder" form="subscriptionform" />
-<roundcube:button command="rename-folder" type="input" class="button" label="rename" />
 </div>
 </div>
 

--
Gitblit v1.9.1