thomascube
2006-07-25 24053e0d308d6c80149b812cda8774ed3d6ed71d
Several bugfixes and improvements. See CHANGELOG for details

1 files added
15 files modified
565 ■■■■ changed files
CHANGELOG 13 ●●●●● patch | view | raw | blame | history
program/js/app.js 326 ●●●● patch | view | raw | blame | history
program/lib/imap.inc 19 ●●●● patch | view | raw | blame | history
program/localization/de_CH/labels.inc 2 ●●●●● patch | view | raw | blame | history
program/localization/de_CH/messages.inc 2 ●●● patch | view | raw | blame | history
program/localization/de_DE/labels.inc 2 ●●●●● patch | view | raw | blame | history
program/localization/de_DE/messages.inc 2 ●●● patch | view | raw | blame | history
program/localization/en_US/labels.inc 2 ●●● patch | view | raw | blame | history
program/localization/es/labels.inc 66 ●●●●● patch | view | raw | blame | history
program/localization/es/messages.inc 24 ●●●● patch | view | raw | blame | history
program/steps/mail/func.inc 3 ●●●●● patch | view | raw | blame | history
program/steps/settings/manage_folders.inc 54 ●●●●● patch | view | raw | blame | history
skins/default/addresses.css 2 ●●● patch | view | raw | blame | history
skins/default/images/icons/edit.png patch | view | raw | blame | history
skins/default/settings.css 32 ●●●● patch | view | raw | blame | history
skins/default/templates/managefolders.html 16 ●●●● patch | view | raw | blame | history
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)
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)
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";
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';
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...';
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';
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...';
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';
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';
?>
?>
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';
?>
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);
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";
    }
skins/default/addresses.css
@@ -19,7 +19,7 @@
  position: absolute;
  top: 60px;
  left: 490px;
  width: 200px;
  width: 240px;
  height: 20px;
  text-align: left;
}
skins/default/images/icons/edit.png
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;
}
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>