thomascube
2011-12-16 f94e442469deca30b39f3fa08aade83cbd0ede70
program/js/app.js
@@ -145,6 +145,22 @@
    for (n in this.gui_objects)
      this.gui_objects[n] = rcube_find_object(this.gui_objects[n]);
    // clickjacking protection
    if (this.env.x_frame_options) {
      try {
        // bust frame if not allowed
        if (this.env.x_frame_options == 'deny' && top.location.href != self.location.href)
          top.location.href = self.location.href;
        else if (top.location.hostname != self.location.hostname)
          throw 1;
      } catch (e) {
        // possible clickjacking attack: disable all form elements
        $('form').each(function(){ ref.lock_form(this, true); });
        this.display_message("Blocked: possible clickjacking attack!", 'error');
        return;
      }
    }
    // init registered buttons
    this.init_buttons();
@@ -212,7 +228,8 @@
          this.enable_command('reply-list', this.env.list_post);
          if (this.env.action == 'show') {
            this.http_request('pagenav', '_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox),
            this.http_request('pagenav', '_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox)
              + (this.env.search_request ? '&_search='+this.env.search_request : ''),
              this.display_message('', 'loading'));
          }
@@ -890,7 +907,7 @@
        if (!this.gui_objects.messageform)
          break;
        if (!this.check_compose_input())
        if (!props.nocheck && !this.check_compose_input(command))
          break;
        // Reset the auto-save timer
@@ -914,8 +931,8 @@
      case 'send-attachment':
        // Reset the auto-save timer
        self.clearTimeout(this.save_timer);
        this.upload_file(props)
        this.upload_file(props || this.gui_objects.uploadform);
        break;
      case 'insert-sig':
@@ -1380,12 +1397,8 @@
  this.collapse_folder = function(name)
  {
    var li = this.get_folder_li(name, '', true),
      div = $(li.getElementsByTagName('div')[0]);
    if (!div || (!div.hasClass('collapsed') && !div.hasClass('expanded')))
      return;
    var ul = $(li.getElementsByTagName('ul')[0]);
      div = $('div:first', li),
      ul = $('ul:first', li);
    if (div.hasClass('collapsed')) {
      ul.show();
@@ -1393,7 +1406,7 @@
      var reg = new RegExp('&'+urlencode(name)+'&');
      this.env.collapsed_folders = this.env.collapsed_folders.replace(reg, '');
    }
    else {
    else if (div.hasClass('expanded')) {
      ul.hide();
      div.removeClass('expanded').addClass('collapsed');
      this.env.collapsed_folders = this.env.collapsed_folders+'&'+urlencode(name)+'&';
@@ -1402,6 +1415,8 @@
      if (this.env.mailbox.indexOf(name + this.env.delimiter) == 0)
        this.command('list', name);
    }
    else
      return;
    // Work around a bug in IE6 and IE7, see #1485309
    if (bw.ie6 || bw.ie7) {
@@ -2007,6 +2022,7 @@
      url += '&_refresh=1';
    this.select_folder(mbox, '', true);
    this.unmark_folder(mbox, 'recent', '', true);
    this.env.mailbox = mbox;
    // load message list remotely
@@ -2944,7 +2960,7 @@
  };
  // checks the input fields before sending a message
  this.check_compose_input = function()
  this.check_compose_input = function(cmd)
  {
    // check input fields
    var ed, input_to = $("[name='_to']"),
@@ -2979,15 +2995,28 @@
    // display localized warning for missing subject
    if (input_subject.val() == '') {
      var subject = prompt(this.get_label('nosubjectwarning'), this.get_label('nosubject'));
      var myprompt = $('<div class="prompt">').html('<div class="message">' + this.get_label('nosubjectwarning') + '</div>').appendTo(document.body);
      var prompt_value = $('<input>').attr('type', 'text').attr('size', 30).appendTo(myprompt).val(this.get_label('nosubject'));
      // user hit cancel, so don't send
      if (!subject && subject !== '') {
      var buttons = {};
      buttons[this.get_label('cancel')] = function(){
        input_subject.focus();
        return false;
      }
      else
        input_subject.val((subject ? subject : this.get_label('nosubject')));
        $(this).dialog('close');
      };
      buttons[this.get_label('sendmessage')] = function(){
        input_subject.val(prompt_value.val());
        $(this).dialog('close');
        ref.command(cmd, { nocheck:true });  // repeat command which triggered this
      };
      myprompt.dialog({
        modal: true,
        resizable: false,
        buttons: buttons,
        close: function(event, ui) { $(this).remove() }
      });
      prompt_value.select();
      return false;
    }
    // Apply spellcheck changes if spell checker is active
@@ -3019,6 +3048,11 @@
      this.display_spellcheck_controls(false);
      this.plain2html($('#'+props.id).val(), props.id);
      tinyMCE.execCommand('mceAddControl', false, props.id);
      if (this.env.default_font)
        window.setTimeout(function() {
          $(tinyMCE.get(props.id).getBody()).css('font-family', rcmail.env.default_font);
        }, 500);
    }
    else {
      var thisMCE = tinyMCE.get(props.id), existingHtml;
@@ -3323,9 +3357,9 @@
        ts = frame_name.replace(/^rcmupload/, '');
      if (this.env.loadingicon)
        content = '<img src="'+this.env.loadingicon+'" alt="" />'+content;
        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"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content;
        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 });
      // upload progress support
@@ -3346,7 +3380,7 @@
    if (!this.gui_objects.attachmentlist)
      return false;
    var indicator, li = $('<li>').attr('id', name).html(att.html);
    var indicator, li = $('<li>').attr('id', name).addClass(att.classname).html(att.html);
    // replace indicator's li
    if (upload_id && (indicator = document.getElementById(upload_id))) {
@@ -4041,7 +4075,7 @@
  this.delete_contacts = function()
  {
    var selection = this.contact_list.get_selection(),
      undelete = this.env.address_sources[this.env.source].undelete;
      undelete = this.env.source && this.env.address_sources[this.env.source].undelete;
    // exit if no mailbox specified or if selection is empty
    if (!(selection.length || this.env.cid) || (!undelete && !confirm(this.get_label('deletecontactconfirm'))))
@@ -5434,6 +5468,18 @@
    }
  };
  // adds a class to selected folder
  this.mark_folder = function(name, class_name, prefix, encode)
  {
    $(this.get_folder_li(name, prefix, encode)).addClass(class_name);
  };
  // adds a class to selected folder
  this.unmark_folder = function(name, class_name, prefix, encode)
  {
    $(this.get_folder_li(name, prefix, encode)).removeClass(class_name);
  };
  // helper method to find a folder list item
  this.get_folder_li = function(name, prefix, encode)
  {
@@ -5541,13 +5587,18 @@
  };
  // update the mailboxlist
  this.set_unread_count = function(mbox, count, set_title)
  this.set_unread_count = function(mbox, count, set_title, mark)
  {
    if (!this.gui_objects.mailboxlist)
      return false;
    this.env.unread_counts[mbox] = count;
    this.set_unread_count_display(mbox, set_title);
    if (mark)
      this.mark_folder(mbox, mark, '', true);
    else if (!count)
      this.unmark_folder(mbox, 'recent', '', true);
  };
  // update the mailbox count display
@@ -5573,7 +5624,7 @@
      }
      if (mycount && text_obj.length)
        text_obj.html(' ('+mycount+')');
        text_obj.html(this.env.unreadwrap.replace(/%[sd]/, mycount));
      else if (text_obj.length)
        text_obj.remove();
@@ -5733,10 +5784,13 @@
    });
  };
  this.plain2html = function(plainText, id)
  this.plain2html = function(plain, id)
  {
    var lock = this.set_busy(true, 'converting');
    $('#'+id).val(plainText ? '<pre>'+plainText+'</pre>' : '');
    plain = plain.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
    $('#'+id).val(plain ? '<pre>'+plain+'</pre>' : '');
    this.set_busy(false, null, lock);
  };