Aleksander Machniak
2016-05-22 87cf0a3fb158b5ffaa54a79997d7b01492d39b74
program/js/app.js
@@ -341,8 +341,9 @@
        }
        else if (this.env.action == 'get') {
          this.enable_command('download', 'print', true);
          if (this.env.mimetype == 'message/rfc822') {
            this.enable_command('reply', 'reply-all', 'forward', 'forward-inline', 'forward-attachment', true);
          if (this.env.is_message) {
            this.enable_command('reply', 'reply-all', 'edit', 'viewsource',
              'forward', 'forward-inline', 'forward-attachment', true);
            if (this.env.list_post)
              this.enable_command('reply-list', true);
          }
@@ -1217,7 +1218,7 @@
            this.open_window(this.env.comm_path + url, true, true);
          }
        }
        else if (this.env.action == 'get' && this.env.mimetype != 'message/rfc822') {
        else if (this.env.action == 'get' && !this.env.is_message) {
          this.gui_objects.messagepartframe.contentWindow.print();
        }
        else if (uid = this.get_single_uid()) {
@@ -1368,7 +1369,7 @@
    if (!aborted && this.triggerEvent('after'+command, props) === false)
      ret = false;
    this.triggerEvent('actionafter', { props:props, action:command, aborted:aborted });
    this.triggerEvent('actionafter', { props:props, action:command, aborted:aborted, ret:ret });
    return ret === false ? false : obj ? false : true;
  };
@@ -2037,8 +2038,9 @@
      flagged: flags.flagged?1:0,
      has_children: flags.has_children?1:0,
      depth: flags.depth?flags.depth:0,
      unread_children: flags.unread_children?flags.unread_children:0,
      parent_uid: flags.parent_uid?flags.parent_uid:0,
      unread_children: flags.unread_children || 0,
      flagged_children: flags.flagged_children || 0,
      parent_uid: flags.parent_uid || 0,
      selected: this.select_all_mode || this.message_list.in_selection(uid),
      ml: flags.ml?1:0,
      ctype: flags.ctype,
@@ -2118,6 +2120,9 @@
      if (flags.unread_children && flags.seen && !message.expanded)
        row_class += ' unroot';
      if (flags.flagged_children && !message.expanded)
        row_class += ' flaggedroot';
    }
    tree += '<span id="msgicn'+row.id+'" class="'+css_class+status_class+'" title="'+status_label+'"></span>';
@@ -2155,7 +2160,7 @@
          html = '<span class="attachment" title="'+label+'"></span>';
        else if (/multipart\/report/.test(flags.ctype))
          html = '<span class="report"></span>';
          else
        else
          html = '&nbsp;';
      }
      else if (c == 'status') {
@@ -2576,9 +2581,10 @@
  {
    var row = this.message_list.rows[uid];
    // handle unread_children mark
    // handle unread_children/flagged_children mark
    row.expanded = !row.expanded;
    this.set_unread_children(uid);
    this.set_flagged_children(uid);
    row.expanded = !row.expanded;
    this.message_list.expand_row(e, uid);
@@ -2711,7 +2717,13 @@
    }
    else if (flag == 'unread' && p.has_children) {
      // unread_children may be undefined
      p.unread_children = p.unread_children ? p.unread_children + 1 : 1;
      p.unread_children = (p.unread_children || 0) + 1;
    }
    else if (flag == 'unflagged' && p.flagged_children) {
      p.flagged_children--;
    }
    else if (flag == 'flagged' && p.has_children) {
      p.flagged_children = (p.flagged_children || 0) + 1;
    }
    else {
      return;
@@ -2719,6 +2731,7 @@
    this.set_message_icon(root);
    this.set_unread_children(root);
    this.set_flagged_children(root);
  };
  // update thread indicators for all messages in a thread below the specified message
@@ -2736,11 +2749,19 @@
    if (!row.depth) // root message: decrease roots count
      count--;
    else if (row.unread) {
      // update unread_children for thread root
    // update unread_children for thread root
    if (row.depth && row.unread) {
      parent = this.message_list.find_root(uid);
      rows[parent].unread_children--;
      this.set_unread_children(parent);
    }
    // update unread_children for thread root
    if (row.depth && row.flagged) {
      parent = this.message_list.find_root(uid);
      rows[parent].flagged_children--;
      this.set_flagged_children(parent);
    }
    parent = row.parent_uid;
@@ -2784,9 +2805,11 @@
      row = row.nextSibling;
    }
    // update unread_children for roots
    for (r=0; r<roots.length; r++)
    // update unread_children/flagged_children for roots
    for (r=0; r<roots.length; r++) {
      this.set_unread_children(roots[r].uid);
      this.set_flagged_children(roots[r].uid);
    }
    return count;
  };
@@ -2885,6 +2908,9 @@
      if (row.unread != status)
        this.update_thread_root(uid, status ? 'unread' : 'read');
    }
    else if (flag == 'flagged') {
      this.update_thread_root(uid, status ? 'flagged' : 'unflagged');
    }
    if ($.inArray(flag, ['unread', 'deleted', 'replied', 'forwarded', 'flagged']) > -1)
      row[flag] = status;
@@ -2916,10 +2942,20 @@
    if (row.parent_uid)
      return;
    if (!row.unread && row.unread_children && !row.expanded)
      $(row.obj).addClass('unroot');
    else
      $(row.obj).removeClass('unroot');
    var enable = !row.unread && row.unread_children && !row.expanded;
    $(row.obj)[enable ? 'addClass' : 'removeClass']('unroot');
  };
  // sets flaggedroot (flagged_children) class of parent row
  this.set_flagged_children = function(uid)
  {
    var row = this.message_list.rows[uid];
    if (row.parent_uid)
      return;
    var enable = row.flagged_children && !row.expanded;
    $(row.obj)[enable ? 'addClass' : 'removeClass']('flaggedroot');
  };
  // copy selected messages to the specified mailbox
@@ -3483,6 +3519,12 @@
        // enable encrypted compose toggle
        this.enable_command('compose-encrypted', !is_html);
      }
      // make sure to disable encryption button after toggling editor into HTML mode
      this.addEventListener('actionafter', function(args) {
        if (args.ret && args.action == 'toggle-editor')
          ref.enable_command('compose-encrypted', !args.props.html);
      });
    }
  };
@@ -3577,14 +3619,6 @@
      // list recipients with missing keys
      if (!isvalid && missing_keys.length) {
        // load publickey.js
        if (!$('script#publickeyjs').length) {
          $('<script>')
            .attr('id', 'publickeyjs')
            .attr('src', ref.assets_path('program/js/publickey.js'))
            .appendTo(document.body);
        }
        // display dialog with missing keys
        ref.show_popup_dialog(
          ref.get_label('nopubkeyfor').replace('$email', missing_keys.join(', ')) +
@@ -4300,8 +4334,6 @@
    if (result) {
      // update internal format flag
      $("input[name='_is_html']").val(props.html ? 1 : 0);
      // enable encrypted compose toggle
      this.enable_command('compose-encrypted', !props.html);
    }
    return result;
@@ -7836,8 +7868,6 @@
    var url = '?_task=utils&_action=' + (format == 'html' ? 'html2text' : 'text2html'),
      lock = this.set_busy(true, 'converting');
    this.log('HTTP POST: ' + url);
    $.ajax({ type: 'POST', url: url, data: text, contentType: 'application/octet-stream',
      error: function(o, status, err) { ref.http_error(o, status, err, lock); },
      success: function(data) {
@@ -8019,22 +8049,23 @@
    if (response.env)
      this.set_env(response.env);
    var i;
    // we have labels to add
    if (typeof response.texts === 'object') {
      for (var name in response.texts)
        if (typeof response.texts[name] === 'string')
          this.add_label(name, response.texts[name]);
      for (i in response.texts)
        if (typeof response.texts[i] === 'string')
          this.add_label(i, response.texts[i]);
    }
    // if we get javascript code from server -> execute it
    if (response.exec) {
      this.log(response.exec);
      eval(response.exec);
    }
    // execute callback functions of plugins
    if (response.callbacks && response.callbacks.length) {
      for (var i=0; i < response.callbacks.length; i++)
      for (i=0; i < response.callbacks.length; i++)
        this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]);
    }