alecpl
2011-11-11 ecfaed571b2c38f4bcc2b6a0fa39fba15a5126ce
program/js/app.js
@@ -20,7 +20,7 @@
function rcube_webmail()
{
  this.env = {};
  this.env = { recipients_separator:',', recipients_delimiter:', ' };
  this.labels = {};
  this.buttons = {};
  this.buttons_sel = {};
@@ -207,7 +207,7 @@
          'moveto', 'copy', 'delete', 'open', 'mark', 'edit', 'viewsource', 'download',
          'print', 'load-attachment', 'load-headers', 'forward-attachment'];
        if (this.env.action=='show' || this.env.action=='preview') {
        if (this.env.action == 'show' || this.env.action == 'preview') {
          this.enable_command(this.env.message_commands, this.env.uid);
          this.enable_command('reply-list', this.env.list_post);
@@ -460,7 +460,7 @@
    }
    // check input before leaving compose step
    if (this.task=='mail' && this.env.action=='compose' && $.inArray(command, this.env.compose_commands)<0) {
    if (this.task == 'mail' && this.env.action == 'compose' && $.inArray(command, this.env.compose_commands)<0) {
      if (this.cmp_hash != this.compose_field_hash() && !confirm(this.get_label('notsentwarning')))
        return false;
    }
@@ -815,13 +815,7 @@
        if (this.task == 'mail') {
          url += '&_mbox='+urlencode(this.env.mailbox);
          if (this.env.mailbox == this.env.drafts_mailbox) {
            var uid;
            if (uid = this.get_single_uid())
              url += '&_draft_uid='+uid;
          }
          else if (props)
          if (props)
             url += '&_to='+urlencode(props);
        }
        // modify url if we're in addressbook
@@ -845,7 +839,9 @@
          }
          if (a_cids.length)
            this.http_post('mailto', {_cid: a_cids.join(','), _source: this.env.source}, true);
            this.http_post('mailto', { _cid: a_cids.join(','), _source: this.env.source}, true);
          else if (this.env.group)
            this.http_post('mailto', { _gid: this.env.group, _source: this.env.source}, true);
          break;
        }
@@ -1676,23 +1672,18 @@
      flags: flags.extra_flags
    });
    var c, html, tree = expando = '',
    var c, n, col, html, tree = '', expando = '',
      list = this.message_list,
      rows = list.rows,
      tbody = this.gui_objects.messagelist.tBodies[0],
      rowcount = tbody.rows.length,
      even = rowcount%2,
      message = this.env.messages[uid],
      css_class = 'message'
        + (even ? ' even' : ' odd')
        + (!flags.seen ? ' unread' : '')
        + (flags.deleted ? ' deleted' : '')
        + (flags.flagged ? ' flagged' : '')
        + (flags.unread_children && flags.seen && !this.env.autoexpand_threads ? ' unroot' : '')
        + (message.selected ? ' selected' : ''),
      // for performance use DOM instead of jQuery here
      row = document.createElement('tr'),
      col = document.createElement('td');
      row = document.createElement('tr');
    row.id = 'rcmrow'+uid;
    row.className = css_class;
@@ -1719,9 +1710,10 @@
    // threads
    if (this.env.threading) {
      // This assumes that div width is hardcoded to 15px,
      var width = message.depth * 15;
      if (message.depth) {
        // This assumes that div width is hardcoded to 15px,
        tree += '<span id="rcmtab' + uid + '" class="branch" style="width:' + (message.depth * 15) + 'px;">&nbsp;&nbsp;</span>';
        if ((rows[message.parent_uid] && rows[message.parent_uid].expanded === false)
          || ((this.env.autoexpand_threads == 0 || this.env.autoexpand_threads == 2) &&
            (!rows[message.parent_uid] || !rows[message.parent_uid].expanded))
@@ -1736,13 +1728,9 @@
        if (message.expanded === undefined && (this.env.autoexpand_threads == 1 || (this.env.autoexpand_threads == 2 && message.unread_children))) {
          message.expanded = true;
        }
      }
      if (width)
        tree += '<span id="rcmtab' + uid + '" class="branch" style="width:' + width + 'px;">&nbsp;&nbsp;</span>';
      if (message.has_children && !message.depth)
        expando = '<div id="rcmexpando' + uid + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '">&nbsp;&nbsp;</div>';
      }
    }
    tree += '<span id="msgicn'+uid+'" class="'+css_class+'">&nbsp;</span>';
@@ -1756,7 +1744,7 @@
    }
    // add each submitted col
    for (var n in this.env.coltypes) {
    for (n in this.env.coltypes) {
      c = this.env.coltypes[n];
      col = document.createElement('td');
      col.className = String(c).toLowerCase();
@@ -1960,18 +1948,13 @@
  // list messages of a specific mailbox using filter
  this.filter_mailbox = function(filter)
  {
    var search, lock = this.set_busy(true, 'searching');
    if (this.gui_objects.qsearchbox)
      search = this.gui_objects.qsearchbox.value;
    var lock = this.set_busy(true, 'searching');
    this.clear_message_list();
    // reset vars
    this.env.current_page = 1;
    this.http_request('search', '_filter='+filter
        + (search ? '&_q='+urlencode(search) : '')
        + (this.env.mailbox ? '&_mbox='+urlencode(this.env.mailbox) : ''), lock);
    this.http_request('search', this.search_params(false, filter), lock);
  };
  // list messages of a specific mailbox
@@ -2937,6 +2920,8 @@
  this.init_address_input_events = function(obj, props)
  {
    this.env.recipients_delimiter = this.env.recipients_separator + ' ';
    obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e) { return ref.ksearch_keydown(e, this, props); })
      .attr('autocomplete', 'off');
  };
@@ -3426,38 +3411,56 @@
  this.qsearch = function(value)
  {
    if (value != '') {
      var n, r, addurl = '', mods_arr = [],
        mods = this.env.search_mods,
        mbox = this.env.mailbox,
        lock = this.set_busy(true, 'searching');
      var n, lock = this.set_busy(true, 'searching');
      if (this.message_list) {
      if (this.message_list)
        this.clear_message_list();
        if (mods)
          mods = mods[mbox] ? mods[mbox] : mods['*'];
      } else if (this.contact_list) {
      else if (this.contact_list)
        this.list_contacts_clear();
      }
      // reset vars
      this.env.current_page = 1;
      r = this.http_request('search', this.search_params(value)
        + (this.env.source ? '&_source='+urlencode(this.env.source) : '')
        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''), lock);
      this.env.qsearch = {lock: lock, request: r};
    }
  };
  // build URL params for search
  this.search_params = function(search, filter)
  {
    var n, url = [], mods_arr = [],
      mods = this.env.search_mods,
      mbox = this.env.mailbox;
    if (!filter && this.gui_objects.search_filter)
      filter = this.gui_objects.search_filter.value;
    if (!search && this.gui_objects.qsearchbox)
      search = this.gui_objects.qsearchbox.value;
    if (filter)
      url.push('_filter=' + urlencode(filter));
    if (search) {
      url.push('_q='+urlencode(search));
      if (mods && this.message_list)
        mods = mods[mbox] ? mods[mbox] : mods['*'];
      if (mods) {
        for (n in mods)
          mods_arr.push(n);
        addurl += '&_headers='+mods_arr.join(',');
        url.push('_headers='+mods_arr.join(','));
      }
      if (this.gui_objects.search_filter)
        addurl += '&_filter=' + this.gui_objects.search_filter.value;
      // reset vars
      this.env.current_page = 1;
      r = this.http_request('search', '_q='+urlencode(value)
        + (mbox ? '&_mbox='+urlencode(mbox) : '')
        + (this.env.source ? '&_source='+urlencode(this.env.source) : '')
        + (this.env.group ? '&_gid='+urlencode(this.env.group) : '')
        + (addurl ? addurl : ''), lock);
      this.env.qsearch = {lock: lock, request: r};
    }
    if (mbox)
      url.push('_mbox='+urlencode(mbox));
    return url.join('&');
  };
  // reset quick-search form
@@ -3583,13 +3586,13 @@
    // insert all members of a group
    if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].id) {
      insert += this.env.contacts[id].name + ', ';
      insert += this.env.contacts[id].name + this.env.recipients_delimiter;
      this.group2expand = $.extend({}, this.env.contacts[id]);
      this.group2expand.input = this.ksearch_input;
      this.http_request('mail/group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false);
    }
    else if (typeof this.env.contacts[id] === 'string') {
      insert = this.env.contacts[id] + ', ';
      insert = this.env.contacts[id] + this.env.recipients_delimiter;
      trigger = true;
    }
@@ -3626,7 +3629,7 @@
    // get string from current cursor pos to last comma
    var cpos = this.get_caret_pos(this.ksearch_input),
      p = inp_value.lastIndexOf(',', cpos-1),
      p = inp_value.lastIndexOf(this.env.recipients_separator, cpos-1),
      q = inp_value.substring(p+1, cpos),
      min = this.env.autocomplete_min_length,
      ac = this.ksearch_data;
@@ -3869,7 +3872,7 @@
      }
    }
    this.enable_command('compose', list.selection.length > 0);
    this.enable_command('compose', this.env.group || list.selection.length > 0);
    this.enable_command('edit', id && writable);
    this.enable_command('delete', list.selection.length && writable);
@@ -3955,7 +3958,8 @@
  {
    this.contact_list.clear(true);
    this.show_contentframe(false);
    this.enable_command('delete', 'compose', false);
    this.enable_command('delete', false);
    this.enable_command('compose', this.env.group ? true : false);
  };
  // load contact record
@@ -4100,31 +4104,29 @@
  // add row to contacts list
  this.add_contact_row = function(cid, cols, select)
  {
    if (!this.gui_objects.contactslist || !this.gui_objects.contactslist.tBodies[0])
    if (!this.gui_objects.contactslist)
      return false;
    var tbody = this.gui_objects.contactslist.tBodies[0],
      rowcount = tbody.rows.length,
      even = rowcount%2,
    var c, list = this.contact_list,
      row = document.createElement('tr');
    row.id = 'rcmrow'+String(cid).replace(this.identifier_expr, '_');
    row.className = 'contact '+(even ? 'even' : 'odd');
    row.className = 'contact';
    if (this.contact_list.in_selection(cid))
    if (list.in_selection(cid))
      row.className += ' selected';
    // add each submitted col
    for (var c in cols) {
    for (c in cols) {
      col = document.createElement('td');
      col.className = String(c).toLowerCase();
      col.innerHTML = cols[c];
      row.appendChild(col);
    }
    this.contact_list.insert_row(row);
    list.insert_row(row);
    this.enable_command('export', (this.contact_list.rowcount > 0));
    this.enable_command('export', list.rowcount > 0);
  };
  this.init_contact_form = function()
@@ -4145,6 +4147,21 @@
      ref.insert_edit_field($(this).val(), $(this).attr('rel'), this);
      this.selectedIndex = 0;
    });
    // enable date pickers on date fields
    if ($.datepicker && this.env.date_format) {
      $.datepicker.setDefaults({
        dateFormat: this.env.date_format,
        changeMonth: true,
        changeYear: true,
        yearRange: '-100:+10',
        showOtherMonths: true,
        selectOtherMonths: true,
        monthNamesShort: this.env.month_names,
        onSelect: function(dateText) { $(this).focus().val(dateText) }
      });
      $('input.datepicker').datepicker();
    }
    $("input[type='text']:visible").first().focus();
  };
@@ -4401,6 +4418,9 @@
            .appendTo(cell);
          this.init_edit_field(col, input);
          if (colprop.type == 'date' && $.datepicker)
            input.datepicker();
        }
        else if (colprop.type == 'composite') {
          var childcol, cp, first, templ, cols = [], suffices = [];