Thomas Bruederli
2013-10-19 ada51d1d0eac8a1c4448a664c42e8712bce9e650
program/js/app.js
@@ -398,7 +398,7 @@
        }
        else if (this.env.action == 'edit-folder' && this.gui_objects.editform) {
          this.enable_command('save', 'folder-size', true);
          parent.rcmail.env.messagecount = this.env.messagecount;
          parent.rcmail.env.exists = this.env.messagecount;
          parent.rcmail.enable_command('purge', this.env.messagecount);
          $("input[type='text']").first().select();
        }
@@ -1713,7 +1713,7 @@
    // set eventhandler to status icon
    if (row.icon = document.getElementById(status_icon)) {
      row.icon._row = row.obj;
      row.icon.onmousedown = function(e) { self.command('toggle_status', this); rcube_event.cancel(e); };
      row.icon.onclick = function(e) { self.command('toggle_status', this); return rcube_event.cancel(e); };
    }
    // save message icon position too
@@ -1725,12 +1725,20 @@
    // set eventhandler to flag icon, if icon found
    if (this.env.flagged_col != null && (row.flagicon = document.getElementById('flagicn'+row.uid))) {
      row.flagicon._row = row.obj;
      row.flagicon.onmousedown = function(e) { self.command('toggle_flag', this); rcube_event.cancel(e); };
      row.flagicon.onclick = function(e) { self.command('toggle_flag', this); return rcube_event.cancel(e); };
    }
    if (!row.depth && row.has_children && (expando = document.getElementById('rcmexpando'+row.uid))) {
      row.expando = expando;
      expando.onmousedown = function(e) { return self.expand_message_row(e, uid); };
      expando.onclick = function(e) { return self.expand_message_row(e, uid); };
      if (bw.touch) {
        expando.addEventListener('touchend', function(e) {
          if (e.changedTouches.length == 1) {
            self.expand_message_row(e, uid);
            return rcube_event.cancel(e);
          }
        }, false);
      }
    }
    this.triggerEvent('insertrow', { uid:uid, row:row });
@@ -1776,7 +1784,6 @@
        + (!flags.seen ? ' unread' : '')
        + (flags.deleted ? ' deleted' : '')
        + (flags.flagged ? ' flagged' : '')
        + (flags.unread_children && flags.seen && !this.env.autoexpand_threads ? ' unroot' : '')
        + (message.selected ? ' selected' : ''),
      row = { cols:[], style:{}, id:'rcmrow'+uid };
@@ -1826,6 +1833,9 @@
        expando = '<div id="rcmexpando' + uid + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '">&nbsp;&nbsp;</div>';
        row_class += ' thread' + (message.expanded? ' expanded' : '');
      }
      if (flags.unread_children && flags.seen && !message.expanded)
        row_class += ' unroot';
    }
    tree += '<span id="msgicn'+uid+'" class="'+css_class+'">&nbsp;</span>';
@@ -1871,7 +1881,7 @@
        html = expando;
      else if (c == 'subject') {
        if (bw.ie) {
          col.onmouseover = function() { rcube_webmail.long_subject_title_ie(this, message.depth+1); };
          col.onmouseover = function() { rcube_webmail.long_subject_title_ex(this, message.depth+1); };
          if (bw.ie8)
            tree = '<span></span>' + tree; // #1487821
        }
@@ -2822,10 +2832,10 @@
  {
    var len = a_uids.length,
      i, uid, all_deleted = true,
      rows = this.message_list ? this.message_list.rows : [];
      rows = this.message_list ? this.message_list.rows : {};
    if (len == 1) {
      if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted))
      if (!this.message_list || (rows[a_uids[0]] && !rows[a_uids[0]].deleted))
        this.flag_as_deleted(a_uids);
      else
        this.flag_as_undeleted(a_uids);
@@ -2866,7 +2876,7 @@
    var r_uids = [],
      post_data = this.selection_post_data({_uid: this.uids_to_list(a_uids), _flag: 'delete'}),
      lock = this.display_message(this.get_label('markingmessage'), 'loading'),
      rows = this.message_list ? this.message_list.rows : [],
      rows = this.message_list ? this.message_list.rows : {},
      count = 0;
    for (var i=0, len=a_uids.length; i<len; i++) {
@@ -2886,7 +2896,7 @@
    // make sure there are no selected rows
    if (this.env.skip_deleted && this.message_list) {
      if(!this.env.display_next)
      if (!this.env.display_next)
        this.message_list.clear_selection();
      if (count < 0)
        post_data._count = (count*-1);
@@ -2910,7 +2920,7 @@
  this.flag_deleted_as_read = function(uids)
  {
    var icn_src, uid, i, len,
      rows = this.message_list ? this.message_list.rows : [];
      rows = this.message_list ? this.message_list.rows : {};
    uids = String(uids).split(',');
@@ -3417,7 +3427,8 @@
      message = input_message.val(),
      is_html = ($("input[name='_is_html']").val() == '1'),
      sig = this.env.identity,
      delim = this.env.recipients_delimiter,
      delim = this.env.recipients_separator,
      rx_delim = RegExp.escape(delim),
      headers = ['replyto', 'bcc'];
    // update reply-to/bcc fields with addresses defined in identities
@@ -3434,16 +3445,18 @@
      }
      // cleanup
      rx = new RegExp(RegExp.escape(delim) + '\\s*' + RegExp(delim), 'g');
      input_val = input_val.replace(rx, delim)
      rx = new RegExp('^\\s*' + RegExp.escape(delim) + '\\s*$');
      input_val = input_val.replace(rx, '')
      rx = new RegExp(rx_delim + '\\s*' + rx_delim, 'g');
      input_val = input_val.replace(rx, delim);
      rx = new RegExp('^[\\s' + rx_delim + ']+');
      input_val = input_val.replace(rx, '');
      // add new address(es)
      if (new_val) {
        rx = new RegExp(RegExp.escape(delim) + '\\s*$');
        if (input_val && !rx.test(input_val))
          input_val += delim + ' ';
      if (new_val && input_val.indexOf(new_val) == -1 && input_val.indexOf(new_val.replace(/"/g, '')) == -1) {
        if (input_val) {
          rx = new RegExp('[' + rx_delim + '\\s]+$')
          input_val = input_val.replace(rx, '') + delim + ' ';
        }
        input_val += new_val + delim + ' ';
      }
@@ -3546,6 +3559,7 @@
    }
    this.env.identity = id;
    this.triggerEvent('change_identity');
    return true;
  };
@@ -3629,7 +3643,12 @@
      att.html = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+name+'\', \''+att.frame+'\');" href="#cancelupload" class="cancelupload">'
        + (this.env.cancelicon ? '<img src="'+this.env.cancelicon+'" alt="" />' : this.get_label('cancel')) + '</a>' + att.html;
    var indicator, li = $('<li>').attr('id', name).addClass(att.classname).html(att.html);
    var indicator, li = $('<li>');
    li.attr('id', name)
      .addClass(att.classname)
      .html(att.html)
      .on('mouseover', function() { rcube_webmail.long_subject_title_ex(this, 0); });
    // replace indicator's li
    if (upload_id && (indicator = document.getElementById(upload_id))) {
@@ -3775,7 +3794,7 @@
    this.env.search_id = null;
  };
  this.sent_successfully = function(type, msg, target)
  this.sent_successfully = function(type, msg, folders)
  {
    this.display_message(msg, type);
@@ -3784,9 +3803,11 @@
      this.lock_form(this.gui_objects.messageform);
      if (rc) {
        rc.display_message(msg, type);
        // refresh the folder where sent message was saved
        if (target && rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == target)
          rc.command('checkmail');
        // refresh the folder where sent message was saved or replied message comes from
        if (folders && rc.env.task == 'mail' && rc.env.action == '' && $.inArray(rc.env.mailbox, folders) >= 0) {
          // @TODO: try with 'checkmail' here when #1485186 is fixed. See also #1489249.
          rc.command('list');
        }
      }
      setTimeout(function(){ window.close() }, 1000);
    }
@@ -4333,7 +4354,7 @@
        boxtitle.append('&nbsp;&raquo;&nbsp;');
      }
      boxtitle.append($('<span>'+prop.name+'</span>'));
      boxtitle.append($('<span>').text(prop.name));
    }
    this.triggerEvent('groupupdate', prop);
@@ -6514,7 +6535,7 @@
  // post the given form to a hidden iframe
  this.async_upload_form = function(form, action, onload)
  {
    var ts = new Date().getTime(),
    var frame, ts = new Date().getTime(),
      frame_name = 'rcmupload'+ts;
    // upload progress support
@@ -6533,21 +6554,19 @@
    // have to do it this way for IE
    // otherwise the form will be posted to a new window
    if (document.all) {
      var html = '<iframe name="'+frame_name+'" src="program/resources/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
      document.body.insertAdjacentHTML('BeforeEnd', html);
      document.body.insertAdjacentHTML('BeforeEnd', '<iframe name="'+frame_name+'"'
        + ' src="program/resources/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>');
      frame = $('iframe[name="'+frame_name+'"]');
    }
    else { // for standards-compilant browsers
      var frame = document.createElement('iframe');
      frame.name = frame_name;
      frame.style.border = 'none';
      frame.style.width = 0;
      frame.style.height = 0;
      frame.style.visibility = 'hidden';
      document.body.appendChild(frame);
    // for standards-compliant browsers
    else {
      frame = $('<iframe>').attr('name', frame_name)
        .css({border: 'none', width: 0, height: 0, visibility: 'hidden'})
        .appendTo(document.body);
    }
    // handle upload errors, parsing iframe content in onload
    $(frame_name).bind('load', {ts:ts}, onload);
    frame.bind('load', {ts:ts}, onload);
    $(form).attr({
        target: frame_name,
@@ -6974,11 +6993,11 @@
  if (!elem.title) {
    var $elem = $(elem);
    if ($elem.width() + indent * 15 > $elem.parent().width())
      elem.title = $elem.html();
      elem.title = $elem.text();
  }
};
rcube_webmail.long_subject_title_ie = function(elem, indent)
rcube_webmail.long_subject_title_ex = function(elem, indent)
{
  if (!elem.title) {
    var $elem = $(elem),