thomascube
2012-01-05 8304e5d76cd96d78a9cbddaf5d2407b5dc31d079
program/js/app.js
@@ -3,7 +3,7 @@
 | Roundcube Webmail Client Script                                       |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2005-2011, The Roundcube Dev Team                       |
 | Copyright (C) 2005-2012, The Roundcube Dev Team                       |
 | Copyright (C) 2011, Kolab Systems AG                                  |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
@@ -30,6 +30,7 @@
  this.command_handlers = {};
  this.onloads = [];
  this.messages = {};
  this.group2expand = {};
  // create protected reference to myself
  this.ref = 'rcmail';
@@ -246,12 +247,15 @@
          }
        }
        else if (this.env.action == 'compose') {
          this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel', 'toggle-editor'];
          this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel', 'toggle-editor', 'list-adresses'];
          if (this.env.drafts_mailbox)
            this.env.compose_commands.push('savedraft')
          this.enable_command(this.env.compose_commands, 'identities', true);
          // add more commands (not enabled)
          $.merge(this.env.compose_commands, ['add-recipient', 'firstpage', 'previouspage', 'nextpage', 'lastpage']);
          if (this.env.spellcheck) {
            this.env.spellcheck.spelling_state_observer = function(s){ ref.set_spellcheck_state(s); };
@@ -265,6 +269,20 @@
          // init message compose form
          this.init_messageform();
          // init address book widget
          if (this.gui_objects.contactslist) {
            this.contact_list = new rcube_list_widget(this.gui_objects.contactslist,
              { multiselect:true, draggable:false, keyboard:false });
            this.contact_list.addEventListener('select', function(o){ ref.compose_recipeint_select(o); });
            this.contact_list.addEventListener('dblclick', function(o){ ref.compose_add_recipient('to'); });
            this.contact_list.init();
          }
          if (this.gui_objects.adressbookslist) {
            this.gui_objects.folderlist = this.gui_objects.adressbookslist;
            this.enable_command('list-adresses', true);
          }
        }
        // show printing dialog
        else if (this.env.action == 'print' && this.env.uid)
@@ -351,11 +369,18 @@
        this.enable_command('preferences', 'identities', 'save', 'folders', true);
        if (this.env.action == 'identities') {
          this.enable_command('add', this.env.identities_level < 2);
          this.enable_command('add', 'delete', this.env.identities_level < 2);
        }
        else if (this.env.action == 'edit-identity' || this.env.action == 'add-identity') {
          this.enable_command('add', this.env.identities_level < 2);
          this.enable_command('save', 'delete', 'edit', 'toggle-editor', true);
          this.enable_command('save', 'edit', 'toggle-editor', true);
          if (this.is_framed() && this.env.identities_level < 2)
            this.set_button('delete', 'act');  // activate button but delegate command to parent
          else
            this.enable_command('delete', this.env.identities_level < 2);
          if (this.env.action == 'add-identity')
            $("input[type='text']").first().select();
        }
        else if (this.env.action == 'folders') {
          this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'rename-folder', true);
@@ -939,6 +964,15 @@
        this.change_identity($("[name='_from']")[0], true);
        break;
      case 'list-adresses':
        this.list_contacts(props);
        this.enable_command('add-recipient', false);
        break;
      case 'add-recipient':
        this.compose_add_recipient(props);
        break;
      case 'reply-all':
      case 'reply-list':
      case 'reply':
@@ -1043,7 +1077,7 @@
        break;
      case 'upload-photo':
        this.upload_contact_photo(props);
        this.upload_contact_photo(props || this.gui_objects.uploadform);
        break;
      case 'delete-photo':
@@ -1364,7 +1398,7 @@
              if (this.folder_auto_timer)
                window.clearTimeout(this.folder_auto_timer);
              this.folder_auto_expand = k;
              this.folder_auto_expand = this.env.mailboxes[k].id;
              this.folder_auto_timer = window.setTimeout(function() {
                rcmail.command('collapse-folder', rcmail.folder_auto_expand);
                rcmail.drag_start(null);
@@ -1970,10 +2004,10 @@
    if (page > 0 && page <= this.env.pagecount) {
      this.env.current_page = page;
      if (this.task == 'mail')
        this.list_mailbox(this.env.mailbox, page);
      else if (this.task == 'addressbook')
      if (this.task == 'addressbook' || this.contact_list)
        this.list_contacts(this.env.source, this.env.group, page);
      else if (this.task == 'mail')
        this.list_mailbox(this.env.mailbox, page);
    }
  };
@@ -2958,6 +2992,38 @@
    obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e) { return ref.ksearch_keydown(e, this, props); })
      .attr('autocomplete', 'off');
  };
  this.compose_recipeint_select = function(list)
  {
    this.enable_command('add-recipient', list.selection.length > 0);
  };
  this.compose_add_recipient = function(field)
  {
    var recipients = [], input = $('#_'+field);
    if (this.contact_list && this.contact_list.selection.length) {
      for (var id, n=0; n < this.contact_list.selection.length; n++) {
        id = this.contact_list.selection[n];
        if (id && this.env.contactdata[id]) {
          recipients.push(this.env.contactdata[id]);
          // group is added, expand it
          if (id.charAt(0) == 'E' && this.env.contactdata[id].indexOf('@') < 0 && input.length) {
            var gid = id.substr(1);
            this.group2expand[gid] = { name:this.env.contactdata[id], input:input.get(0) };
            this.http_request('group-expand', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(gid), false);
          }
        }
      }
    }
    if (recipients.length && input.length) {
      var oldval = input.val();
      input.val((oldval ? oldval + this.env.recipients_delimiter : '') + recipients.join(this.env.recipients_delimiter));
      this.triggerEvent('add-recipient', { field:field, recipients:recipients });
    }
  };
  // checks the input fields before sending a message
  this.check_compose_input = function(cmd)
@@ -3092,7 +3158,7 @@
      if (!vis)
        this.stop_spellchecking();
      $(this.env.spellcheck.spell_container).css('visibility', vis ? 'visible' : 'hidden');
      $(this.env.spellcheck.spell_container)[vis ? 'show' : 'hide']();
    }
  };
@@ -3360,7 +3426,7 @@
        content = '<img src="'+this.env.loadingicon+'" alt="" class="uploading" />'+content;
      if (this.env.cancelicon)
        content = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+ts+'\', \''+frame_name+'\');" href="#cancelupload" class="cancelupload"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content;
      this.add2attachment_list(ts, { name:'', html:content, complete:false });
      this.add2attachment_list(ts, { name:'', html:content, classname:'uploading', complete:false });
      // upload progress support
      if (this.env.upload_progress_time) {
@@ -3630,8 +3696,7 @@
    // insert all members of a group
    if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].id) {
      insert += this.env.contacts[id].name + this.env.recipients_delimiter;
      this.group2expand = $.extend({}, this.env.contacts[id]);
      this.group2expand.input = this.ksearch_input;
      this.group2expand[this.env.contacts[id].id] = $.extend({ input: this.ksearch_input }, this.env.contacts[id]);
      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') {
@@ -3652,10 +3717,10 @@
  this.replace_group_recipients = function(id, recipients)
  {
    if (this.group2expand && this.group2expand.id == id) {
      this.group2expand.input.value = this.group2expand.input.value.replace(this.group2expand.name, recipients);
      this.triggerEvent('autocomplete_insert', { field:this.group2expand.input, insert:recipients });
      this.group2expand = null;
    if (this.group2expand[id]) {
      this.group2expand[id].input.value = this.group2expand[id].input.value.replace(this.group2expand[id].name, recipients);
      this.triggerEvent('autocomplete_insert', { field:this.group2expand[id].input, insert:recipients });
      this.group2expand[id] = null;
    }
  };
@@ -3994,7 +4059,7 @@
    if (this.env.search_request)
      url += '&_search='+this.env.search_request;
    this.http_request('list', url, lock);
    this.http_request(this.env.task == 'mail' ? 'list-contacts' : 'list', url, lock);
  };
  this.list_contacts_clear = function()
@@ -4200,7 +4265,6 @@
        yearRange: '-100:+10',
        showOtherMonths: true,
        selectOtherMonths: true,
        monthNamesShort: this.env.month_names,
        onSelect: function(dateText) { $(this).focus().val(dateText) }
      });
      $('input.datepicker').datepicker();
@@ -4771,10 +4835,27 @@
    if (!id)
      id = this.env.iid ? this.env.iid : selection[0];
    // append token to request
    this.goto_url('delete-identity', '_iid='+id+'&_token='+this.env.request_token, true);
    // submit request with appended token
    if (confirm(this.get_label('deleteidentityconfirm')))
      this.goto_url('delete-identity', '_iid='+id+'&_token='+this.env.request_token, true);
    return true;
  };
  this.update_identity_row = function(id, name, add)
  {
    var row, col, list = this.identity_list,
      rid = this.html_identifier(id);
    if (list.rows[rid] && (row = list.rows[rid].obj)) {
      $(row.cells[0]).html(name);
    }
    else if (add) {
      row = $('<tr>').attr('id', 'rcmrow'+rid).get(0);
      col = $('<td>').addClass('mail').html(name).appendTo(row);
      list.insert_row(row);
      list.select(rid);
    }
  };
@@ -5400,6 +5481,8 @@
      obj.click(function() { return ref.hide_message(obj); });
    }
    this.triggerEvent('message', { message:msg, type:type, timeout:timeout, object:obj });
    if (timeout > 0)
      window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout);
    return id;
@@ -5582,8 +5665,9 @@
      if (typeof content === 'object' && content.type == 'image')
        this.percent_indicator(this.gui_objects.quotadisplay, content);
      else
        $(this.gui_objects.quotadisplay).html(content);
        $(this.gui_objects.quotadisplay).html(content.percent+'%').attr('title', content.title);
    }
    this.triggerEvent('setquota', content);
  };
  // update the mailboxlist
@@ -5655,16 +5739,6 @@
      this.set_pagetitle(new_title);
    }
  };
  this.toggle_prefer_html = function(checkbox)
  {
    $('#rcmfd_show_images').prop('disabled', !checkbox.checked).val(0);
  };
  this.toggle_preview_pane = function(checkbox)
  {
    $('#rcmfd_preview_pane_mark_read').prop('disabled', !checkbox.checked);
  };
  // display fetched raw headers
@@ -6022,7 +6096,7 @@
          this.enable_command('purge', this.purge_mailbox_test());
          this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading && this.env.messagecount);
          if (response.action == 'list' || response.action == 'search') {
          if ((response.action == 'list' || response.action == 'search') && this.message_list) {
            this.msglist_select(this.message_list);
            this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount });
          }