Aleksander Machniak
2015-01-16 b7e3b15a8a551092a69a43cb7f6af8726988f723
program/js/app.js
@@ -58,7 +58,6 @@
    request_timeout: 180,  // seconds
    draft_autosave: 0,     // seconds
    comm_path: './',
    blankpage: 'program/resources/blank.gif',
    recipients_separator: ',',
    recipients_delimiter: ', ',
    popup_width: 1150,
@@ -162,6 +161,9 @@
      this.goto_url('error', '_code=0x199');
      return;
    }
    if (!this.env.blankpage)
      this.env.blankpage = this.assets_path('program/resources/blank.gif');
    // find all registered gui containers
    for (n in this.gui_containers)
@@ -572,6 +574,7 @@
      this.treelist
        .addEventListener('collapse', function(node) { ref.folder_collapsed(node) })
        .addEventListener('expand', function(node) { ref.folder_collapsed(node) })
        .addEventListener('beforeselect', function(node) { return !ref.busy; })
        .addEventListener('select', function(node) { ref.triggerEvent('selectfolder', { folder:node.id, prefix:'rcmli' }) });
    }
@@ -1052,12 +1055,9 @@
        url = {};
        if (this.task == 'mail') {
          url._mbox = this.env.mailbox;
          url = {_mbox: this.env.mailbox, _search: this.env.search_request};
          if (props)
            url._to = props;
          // also send search request so we can go back to search result after message is sent
          if (this.env.search_request)
            url._search = this.env.search_request;
        }
        // modify url if we're in addressbook
        else if (this.task == 'addressbook') {
@@ -1152,7 +1152,7 @@
      case 'reply-list':
      case 'reply':
        if (uid = this.get_single_uid()) {
          url = {_reply_uid: uid, _mbox: this.get_message_mailbox(uid)};
          url = {_reply_uid: uid, _mbox: this.get_message_mailbox(uid), _search: this.env.search_request};
          if (command == 'reply-all')
            // do reply-list, when list is detected and popup menu wasn't used
            url._all = (!props && this.env.reply_all_mode == 1 && this.commands['reply-list'] ? 'list' : 'all');
@@ -1213,7 +1213,8 @@
      // reset quicksearch
      case 'reset-search':
        var n, s = this.env.search_request || this.env.qsearch;
        var n, s = this.env.search_request || this.env.qsearch,
            ss = this.gui_objects.qsearchbox && this.gui_objects.qsearchbox.value != '';
        this.reset_qsearch();
        this.select_all_mode = false;
@@ -1222,7 +1223,7 @@
          if (this.contact_list)
            this.list_contacts_clear();
        }
        else if (s && this.env.mailbox) {
        else if (s && ss && this.env.mailbox) {
          this.list_mailbox(this.env.mailbox, 1);
        }
        else if (s && this.task == 'addressbook') {
@@ -1406,8 +1407,10 @@
    if (task == 'mail')
      url += '&_mbox=INBOX';
    else if (task == 'logout' && !this.env.server_error)
    else if (task == 'logout' && !this.env.server_error) {
      url += '&_token=' + this.env.request_token;
      this.clear_compose_data();
    }
    this.redirect(url);
  };
@@ -1417,7 +1420,10 @@
    if (!url)
      url = this.env.comm_path;
    return url.replace(/_task=[a-z0-9_-]+/i, '_task='+task);
    if (url.match(/[?&]_task=[a-zA-Z0-9_-]+/))
        return url.replace(/_task=[a-zA-Z0-9_-]+/, '_task=' + task);
    else
        return url.replace(/\?.*$/, '') + '?_task=' + task;
  };
  this.reload = function(delay)
@@ -1948,7 +1954,7 @@
    // attach events
    $.each(fn, function(i, f) {
      row[i].onclick = function(e) { f(e); return rcube_event.cancel(e); };
      if (bw.touch) {
      if (bw.touch && row[i].addEventListener) {
        row[i].addEventListener('touchend', function(e) {
          if (e.changedTouches.length == 1) {
            f(e);
@@ -2252,7 +2258,7 @@
      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_unread_message(id, ref.env.mailbox);
          ref.http_post('mark', {_uid: id, _flag: 'read', _quiet: 1});
          ref.http_post('mark', {_uid: id, _flag: 'read', _mbox: ref.env.mailbox, _quiet: 1});
        }, this.env.preview_pane_mark_read * 1000);
      }
    }
@@ -3772,14 +3778,13 @@
  this.set_draft_id = function(id)
  {
    var rc;
    if (id && id != this.env.draft_id) {
      if (rc = this.opener()) {
        // refresh the drafts folder in opener window
        if (rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == this.env.drafts_mailbox)
          rc.command('checkmail');
      }
      var filter = {task: 'mail', action: ''},
        rc = this.opener(false, filter) || this.opener(true, filter);
      // refresh the drafts folder in the opener window
      if (rc && rc.env.mailbox == this.env.drafts_mailbox)
        rc.command('checkmail');
      this.env.draft_id = id;
      $("input[name='_draft_saveid']").val(id);
@@ -4764,6 +4769,9 @@
    if (!src)
      src = this.env.source;
    if (refresh)
      group = this.env.group;
    if (page && this.current_page == page && src == this.env.source && group == this.env.group)
      return false;
@@ -5787,6 +5795,9 @@
        // on the list when dragging starts (and stops), this is slow, but
        // I didn't find a method to check droptarget on over event
        accept: function(node) {
          if (!$(node).is('.mailbox'))
            return false;
          var source_folder = ref.folder_id2name($(node).attr('id')),
            dest_folder = ref.folder_id2name(this.id),
            source = ref.env.subscriptionrows[source_folder],
@@ -5807,7 +5818,7 @@
  this.folder_id2name = function(id)
  {
    return ref.html_identifier_decode(id.replace(/^rcmli/, ''));
    return id ? ref.html_identifier_decode(id.replace(/^rcmli/, '')) : null;
  };
  this.subscription_select = function(id)
@@ -6554,14 +6565,16 @@
    else
      popup.html(content);
    popup.dialog($.extend({
    options = $.extend({
        title: title,
        buttons: buttons,
        modal: true,
        resizable: true,
        width: 500,
        close: function(event, ui) { $(this).remove(); }
      }, options || {}));
      }, options || {});
    popup.dialog(options);
    // resize and center popup
    var win = $(window), w = win.width(), h = win.height(),
@@ -6713,7 +6726,7 @@
  this.set_quota = function(content)
  {
    if (this.gui_objects.quotadisplay && content && content.type == 'text')
      $(this.gui_objects.quotadisplay).html(content.percent+'%').attr('title', content.title);
      $(this.gui_objects.quotadisplay).text((content.percent||0) + '%').attr('title', content.title);
    this.triggerEvent('setquota', content);
    this.env.quota_content = content;
@@ -7880,12 +7893,24 @@
  };
  // get window.opener.rcmail if available
  this.opener = function()
  this.opener = function(deep, filter)
  {
    var i, win = window.opener;
    // catch Error: Permission denied to access property rcmail
    try {
      if (window.opener && !opener.closed && opener.rcmail)
        return opener.rcmail;
      if (win && !win.closed) {
        // try parent of the opener window, e.g. preview frame
        if (deep && (!win.rcmail || win.rcmail.env.framed) && win.parent && win.parent.rcmail)
          win = win.parent;
        if (win.rcmail && filter)
          for (i in filter)
            if (win.rcmail.env[i] != filter[i])
              return;
        return win.rcmail;
      }
    }
    catch (e) {}
  };
@@ -8039,7 +8064,7 @@
    img.onload = function() { ref.env.browser_capabilities.tif = 1; };
    img.onerror = function() { ref.env.browser_capabilities.tif = 0; };
    img.src = 'program/resources/blank.tif';
    img.src = this.assets_path('program/resources/blank.tif');
  };
  this.pdf_support_check = function()
@@ -8052,7 +8077,7 @@
    if (plugin && plugin.enabledPlugin)
        return 1;
    if (window.ActiveXObject) {
    if ('ActiveXObject' in window) {
      try {
        if (plugin = new ActiveXObject("AcroPDF.PDF"))
          return 1;
@@ -8085,7 +8110,7 @@
    if (plugin && plugin.enabledPlugin)
        return 1;
    if (window.ActiveXObject) {
    if ('ActiveXObject' in window) {
      try {
        if (plugin = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))
          return 1;
@@ -8094,6 +8119,15 @@
    }
    return 0;
  };
  this.assets_path = function(path)
  {
    if (this.env.assets_path && !path.startsWith(this.env.assets_path)) {
      path = this.env.assets_path + path;
    }
    return path;
  };
  // Cookie setter
@@ -8160,7 +8194,7 @@
  if (!elem.title) {
    var $elem = $(elem);
    if ($elem.width() + (indent || 0) * 15 > $elem.parent().width())
      elem.title = $elem.text();
      elem.title = rcube_webmail.subject_text(elem);
  }
};
@@ -8177,10 +8211,17 @@
    tmp.remove();
    if (w + $('span.branch', $elem).width() * 15 > $elem.width())
      elem.title = txt;
      elem.title = rcube_webmail.subject_text(elem);
  }
};
rcube_webmail.subject_text = function(elem)
{
  var t = $(elem).clone();
  t.find('.skip-on-drag').remove();
  return t.text();
};
rcube_webmail.prototype.get_cookie = getCookie;
// copy event engine prototype