Thomas Bruederli
2014-02-22 0ca978820c1b15bc5816746ef3a9b405da851db5
program/js/app.js
@@ -1434,11 +1434,31 @@
  this.drag_end = function(e)
  {
    this.drag_active = false;
    this.env.last_folder_target = null;
    var list, model;
    if (this.treelist)
      this.treelist.drag_end();
    // execute drag & drop action when mouse was released
    if (list = this.message_list)
      model = this.env.mailboxes;
    else if (list = this.contact_list)
      model = this.env.contactfolders;
    if (this.drag_active && model && this.env.last_folder_target) {
      var target = model[this.env.last_folder_target];
      list.draglayer.hide();
      if (this.contact_list) {
        if (!this.contacts_drag_menu(e, target))
          this.command('move', target);
      }
      else if (!this.drag_menu(e, target))
        this.command('move', target);
    }
    this.drag_active = false;
    this.env.last_folder_target = null;
  };
  this.drag_move = function(e)
@@ -1499,37 +1519,15 @@
  this.doc_mouse_up = function(e)
  {
    var model, list, id;
    var list, id;
    // ignore event if jquery UI dialog is open
    if ($(rcube_event.get_target(e)).closest('.ui-dialog, .ui-widget-overlay').length)
      return;
    if (list = this.message_list)
      model = this.env.mailboxes;
    else if (list = this.contact_list)
      model = this.env.contactfolders;
    else if (this.ksearch_value)
      this.ksearch_blur();
    list = this.message_list || this.contact_list;
    if (list && !rcube_mouse_is_over(e, list.list.parentNode))
      list.blur();
    // handle mouse release when dragging
    if (this.drag_active && model && this.env.last_folder_target) {
      var target = model[this.env.last_folder_target];
      this.env.last_folder_target = null;
      list.draglayer.hide();
      this.drag_end(e);
      if (this.contact_list) {
        if (!this.contacts_drag_menu(e, target))
          this.command('move', target);
      }
      else if (!this.drag_menu(e, target))
        this.command('move', target);
    }
    // reset 'pressed' buttons
    if (this.buttons_sel) {
@@ -1890,11 +1888,11 @@
    row.className = row_class;
    // build subject link 
    if (!bw.ie && cols.subject) {
    if (cols.subject) {
      var action = flags.mbox == this.env.drafts_mailbox ? 'compose' : 'show';
      var uid_param = flags.mbox == this.env.drafts_mailbox ? '_draft_uid' : '_uid';
      cols.subject = '<a href="./?_task=mail&_action='+action+'&_mbox='+urlencode(flags.mbox)+'&'+uid_param+'='+uid+'"'+
        ' onclick="return rcube_event.cancel(event)" onmouseover="rcube_webmail.long_subject_title(this,'+(message.depth+1)+')">'+cols.subject+'</a>';
        ' onclick="return rcube_event.cancel(event)" onmouseover="rcube_webmail.long_subject_title(this,'+(message.depth+1)+')"><span>'+cols.subject+'</span></a>';
    }
    // add each submitted col
@@ -2054,7 +2052,6 @@
      if (preview && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread && this.env.preview_pane_mark_read >= 0) {
        this.preview_read_timer = setTimeout(function() {
          ref.set_message(id, 'unread', false);
          ref.update_thread_root(id, 'read');
          if (ref.env.unread_counts[ref.env.mailbox]) {
            ref.env.unread_counts[ref.env.mailbox] -= 1;
            ref.set_unread_count(ref.env.mailbox, ref.env.unread_counts[ref.env.mailbox], ref.env.mailbox == 'INBOX');
@@ -2560,8 +2557,11 @@
    if (!row)
      return false;
    if (flag == 'unread')
    if (flag == 'unread') {
      if (row.unread != status)
        this.update_thread_root(uid, status ? 'unread' : 'read');
      row.unread = status;
    }
    else if(flag == 'deleted')
      row.deleted = status;
    else if (flag == 'replied')
@@ -2849,9 +2849,6 @@
      this.set_message(a_uids[i], 'unread', (flag == 'unread' ? true : false));
    this.http_post('mark', post_data, lock);
    for (i=0; i<len; i++)
      this.update_thread_root(a_uids[i], flag);
  };
  // set image to flagged or unflagged
@@ -3142,6 +3139,10 @@
        if (this.env.draft_id && formdata.draft_id && formdata.draft_id != this.env.draft_id) {
          continue;
        }
        // skip records on reply
        if (this.env.reply_msgid && formdata.reply_msgid != this.env.reply_msgid) {
          continue;
        }
        // show dialog asking to restore the message
        if (formdata.changed && formdata.session != this.env.session_id) {
          this.show_popup_dialog(
@@ -3393,7 +3394,7 @@
    if ($("input[name='_is_html']").val() == '1') {
      var editor = tinyMCE.get(this.env.composebody);
      editor.getWin().focus(); // correct focus in IE & Chrome
      editor.selection.setContent(insert, { format:'text' });
      editor.selection.setContent(this.quote_html(insert).replace(/\r?\n/g, '<br/>'), { format:'text' });
    }
    // replace selection in compose textarea
    else {
@@ -3617,8 +3618,10 @@
      this.env.draft_id = id;
      $("input[name='_draft_saveid']").val(id);
      this.remove_compose_data(this.env.compose_id);
    }
    // always remove local copy upon saving as draft
    this.remove_compose_data(this.env.compose_id);
  };
  this.auto_save_start = function()
@@ -3681,6 +3684,9 @@
    if (this.env.draft_id) {
      formdata.draft_id = this.env.draft_id;
    }
    if (this.env.reply_msgid) {
      formdata.reply_msgid = this.env.reply_msgid;
    }
    $('input, select, textarea', this.gui_objects.messageform).each(function(i, elem) {
@@ -6309,7 +6315,7 @@
  {
    // forward call to parent window
    if (this.is_framed()) {
      return parent.rcmail.show_popup_dialog(html, title, buttons);
      return parent.rcmail.show_popup_dialog(html, title, buttons, options);
    }
    var popup = $('<div class="popup">')
@@ -6329,7 +6335,7 @@
    popup.dialog('option', {
      height: Math.min(h - 40, height + 75 + (buttons ? 50 : 0)),
      width: Math.min(w - 20, width + 20)
      width: Math.min(w - 20, width + 36)
    });
    return popup;
@@ -6363,12 +6369,14 @@
  this.mark_folder = function(name, class_name, prefix, encode)
  {
    $(this.get_folder_li(name, prefix, encode)).addClass(class_name);
    this.triggerEvent('markfolder', {folder: name, mark: class_name, status: true});
  };
  // 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);
    this.triggerEvent('markfolder', {folder: name, mark: class_name, status: false});
  };
  // helper method to find a folder list item
@@ -6662,8 +6670,9 @@
  this.element_position = function(element, obj)
  {
    var obj = $(obj), win = $(window),
      width = obj.width(),
      height = obj.height(),
      width = obj.outerWidth(),
      height = obj.outerHeight(),
      menu_pos = obj.data('menu-pos'),
      win_height = win.height(),
      elem_height = $(element).height(),
      elem_width = $(element).width(),
@@ -6671,6 +6680,13 @@
      top = pos.top,
      left = pos.left + width;
    if (menu_pos == 'bottom') {
      top += height;
      left -= width;
    }
    else
      left -= 5;
    if (top + elem_height > win_height) {
      top -= elem_height - height;
      if (top < 0)