Aleksander Machniak
2012-11-11 77de23fa939338546a3e049459ffd29edd9058c2
program/js/app.js
@@ -424,12 +424,14 @@
          $('#rcmloginpwd').focus();
        // detect client timezone
        var dt = new Date(),
          tz = dt.getTimezoneOffset() / -60,
          stdtz = dt.getStdTimezoneOffset() / -60;
        $('#rcmlogintz').val(stdtz);
        $('#rcmlogindst').val(tz > stdtz ? 1 : 0);
        if (window.jstz && !bw.ie6) {
          var timezone = jstz.determine();
          if (timezone.name())
            $('#rcmlogintz').val(timezone.name());
        }
        else {
          $('#rcmlogintz').val(new Date().getStdTimezoneOffset() / -60);
        }
        // display 'loading' message on form submit, lock submit button
        $('form').submit(function () {
@@ -480,7 +482,8 @@
        this.onloads[i]();
      }
    // start keep-alive interval
    // start keep-alive and refresh intervals
    this.start_refresh();
    this.start_keepalive();
  };
@@ -575,7 +578,7 @@
          var prevstate = this.env.compose_extwin;
          $("input[name='_action']", this.gui_objects.messageform).val('compose');
          this.gui_objects.messageform.action = this.url('mail/compose', { _id: this.env.compose_id, _extwin: 1 });
          this.gui_objects.messageform.target = this.open_window('about:blank', 1150, 900);
          this.gui_objects.messageform.target = this.open_window('', 1150, 900);
          this.gui_objects.messageform.submit();
        }
        else {
@@ -615,12 +618,11 @@
        break;
      case 'sort':
        var sort_order, sort_col = props;
        var sort_order = this.env.sort_order,
          sort_col = !this.env.disabled_sort_col ? props : this.env.sort_col;
        if (this.env.sort_col==sort_col)
          sort_order = this.env.sort_order=='ASC' ? 'DESC' : 'ASC';
        else
          sort_order = 'ASC';
        if (!this.env.disabled_sort_order)
          sort_order = this.env.sort_col == sort_col && sort_order == 'ASC' ? 'DESC' : 'ASC';
        // set table header and update env
        this.set_list_sorting(sort_col, sort_order);
@@ -879,10 +881,6 @@
          this.show_message(this.env.first_uid);
        break;
      case 'checkmail':
        this.check_for_recent(true);
        break;
      case 'compose':
        url = {};
@@ -913,7 +911,7 @@
            }
            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);
@@ -950,9 +948,6 @@
          this.auto_save_start();
          break;
        }
        // re-set keep-alive timeout
        this.start_keepalive();
        this.submit_messageform(true);
        break;
@@ -1672,8 +1667,15 @@
      t = Math.max(0, (screen.height - h) / 2 + (screen.top || 0) - 20);
    var wname = 'rcmextwin' + new Date().getTime(),
      extwin = window.open(url + '&_extwin=1', wname, 'width='+w+',height='+h+',top='+t+',left='+l);
      extwin = window.open(url + '&_extwin=1', wname, 'width='+w+',height='+h+',top='+t+',left='+l+',resizable=yes,toolbar=no,status=no');
    extwin.moveTo(l,t);
    // write loading... message to empty windows
    if (!url && extwin.document) {
      extwin.document.write('<html><body>' + this.get_label('loading') + '</body></html>');
    }
    // focus window, delayed to bring to front
    window.setTimeout(function(){ extwin.focus(); }, 10);
    return wname;
@@ -2054,6 +2056,15 @@
      else if (this.task == 'mail')
        this.list_mailbox(this.env.mailbox, page);
    }
  };
  // sends request to check for recent messages
  this.checkmail = function()
  {
    var lock = this.set_busy(true, 'checkingmail'),
      params = this.check_recent_params();
    this.http_request('check-recent', params, lock);
  };
  // list messages of a specific mailbox using filter
@@ -3010,10 +3021,13 @@
    var url = this.url('mail/compose', p);
    // open new compose window
    if (this.env.compose_extwin)
    if (this.env.compose_extwin && !this.env.extwin) {
      this.open_window(url, 1150, 900);
    else
    }
    else {
      this.redirect(url);
      window.resizeTo(Math.max(1150, $(window).width()), Math.max(900, $(window).height()));
    }
  };
  // init message compose form: set focus and eventhandlers
@@ -3032,7 +3046,8 @@
    // close compose step in opener
    if (window.opener && opener.rcmail && opener.rcmail.env.action == 'compose') {
      opener.history.back();
      setTimeout(function(){ opener.history.back(); }, 100);
      this.env.opened_extwin = true;
    }
    // configure parallel autocompletion
@@ -3053,7 +3068,7 @@
      this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length);
      // add signature according to selected identity
      // if we have HTML editor, signature is added in callback
      if (input_from.prop('type') == 'select-one') {
      if (input_from.prop('type') == 'select-one' && !this.env.opened_extwin) {
        this.change_identity(input_from[0]);
      }
    }
@@ -5799,13 +5814,11 @@
        col = this.env.coltypes[n];
        if ((cell = thead.rows[0].cells[n]) && (col == 'from' || col == 'to' || col == 'fromto')) {
          cell.id = 'rcm'+col;
          $('span,a', cell).text(this.get_label(col == 'fromto' ? smart_col : col));
          // if we have links for sorting, it's a bit more complicated...
          if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') {
            cell = cell.firstChild;
            cell.onclick = function(){ return rcmail.command('sort', this.__col, this); };
            cell.__col = col;
          }
          cell.innerHTML = this.get_label(col == 'fromto' ? smart_col : col);
          $('a', cell).click(function(){
            return rcmail.command('sort', this.id.replace(/^rcm/, ''), this);
          });
        }
      }
    }
@@ -6035,10 +6048,18 @@
    if (lock || lock === null)
      this.set_busy(true);
    if (this.is_framed())
    if (this.is_framed()) {
      parent.rcmail.redirect(url, lock);
    else
    }
    else {
      if (this.env.extwin) {
        if (typeof url == 'string')
          url += (url.indexOf('?') < 0 ? '?' : '&') + '_extwin=1';
        else
          url._extwin = 1;
      }
      this.location_href(url, window);
    }
  };
  this.goto_url = function(action, query, lock)
@@ -6059,6 +6080,9 @@
      $('<a>').attr('href', url).appendTo(document.body).get(0).click();
    else
      target.location.href = url;
    // reset keep-alive interval
    this.start_keepalive();
  };
  // send a http request to the server
@@ -6087,6 +6111,9 @@
      success: function(data){ ref.http_response(data); },
      error: function(o, status, err) { ref.http_error(o, status, err, lock, action); }
    });
    // reset keep-alive interval
    this.start_keepalive();
  };
  // send a http POST request to the server
@@ -6104,7 +6131,7 @@
    // trigger plugin hook
    var result = this.triggerEvent('request'+action, postdata);
    if (result !== undefined) {
      // abort if one the handlers returned false
      // abort if one of the handlers returned false
      if (result === false)
        return false;
      else
@@ -6119,6 +6146,9 @@
      success: function(data){ ref.http_response(data); },
      error: function(o, status, err) { ref.http_error(o, status, err, lock, action); }
    });
    // reset keep-alive interval
    this.start_keepalive();
  };
  // aborts ajax request
@@ -6213,6 +6243,7 @@
        }
        break;
      case 'refresh':
      case 'check-recent':
      case 'getunread':
      case 'search':
@@ -6246,6 +6277,9 @@
    this.triggerEvent('responseafter', {response: response});
    this.triggerEvent('responseafter'+response.action, {response: response});
    // reset keep-alive interval
    this.start_keepalive();
  };
  // handle HTTP request errors
@@ -6269,9 +6303,7 @@
    // re-send keep-alive requests after 30 seconds
    if (action == 'keep-alive')
      setTimeout(function(){ ref.keep_alive(); }, 30000);
    else if (action == 'check-recent')
      setTimeout(function(){ ref.check_for_recent(false); }, 30000);
      setTimeout(function(){ ref.keep_alive(); ref.start_keepalive(); }, 30000);
  };
  // post the given form to a hidden iframe
@@ -6441,20 +6473,28 @@
    }
  };
  // starts interval for keep-alive/check-recent signal
  // starts interval for keep-alive signal
  this.start_keepalive = function()
  {
    if (!this.env.keep_alive || this.env.framed)
    if (!this.env.session_lifetime || this.env.framed || this.env.extwin || this.task == 'login' || this.env.action == 'print')
      return;
    if (this._int)
      clearInterval(this._int);
    if (this._keepalive)
      clearInterval(this._keepalive);
    if (this.task == 'mail' && this.gui_objects.mailboxlist)
      this._int = setInterval(function(){ ref.check_for_recent(false); }, this.env.keep_alive * 1000);
    else if (this.task != 'login' && this.env.action != 'print')
      this._int = setInterval(function(){ ref.keep_alive(); }, this.env.keep_alive * 1000);
    this._keepalive = setInterval(function(){ ref.keep_alive(); }, this.env.session_lifetime * 0.5 * 1000);
  };
  // starts interval for refresh signal
  this.start_refresh = function()
  {
    if (!this.env.keep_alive || this.env.framed || this.env.extwin || this.task == 'login' || this.env.action == 'print')
      return;
    if (this._refresh)
      clearInterval(this._refresh);
    this._refresh = setInterval(function(){ ref.refresh(); }, this.env.keep_alive * 1000);
  };
  // sends keep-alive signal
@@ -6464,29 +6504,39 @@
      this.http_request('keep-alive');
  };
  // sends request to check for recent messages
  this.check_for_recent = function(refresh)
  // sends refresh signal
  this.refresh = function()
  {
    if (this.busy)
    if (this.busy) {
      // try again after 10 seconds
      setTimeout(function(){ ref.refresh(); ref.start_refresh(); }, 10000);
      return;
    var lock, url = {_mbox: this.env.mailbox};
    if (refresh) {
      lock = this.set_busy(true, 'checkingmail');
      url._refresh = 1;
      // reset check-recent interval
      this.start_keepalive();
    }
    if (this.gui_objects.messagelist)
      url._list = 1;
    if (this.gui_objects.quotadisplay)
      url._quota = 1;
    if (this.env.search_request)
      url._search = this.env.search_request;
    var params = {}, lock = this.set_busy(true, 'refreshing');
    this.http_request('check-recent', url, lock);
    if (this.task == 'mail' && this.gui_objects.mailboxlist)
      params = this.check_recent_params();
    // plugins should bind to 'requestrefresh' event to add own params
    this.http_request('refresh', params, lock);
  };
  // returns check-recent request parameters
  this.check_recent_params = function()
  {
    var params = {_mbox: this.env.mailbox};
    if (this.gui_objects.mailboxlist)
      params._folderlist = 1;
    if (this.gui_objects.messagelist)
      params._list = 1;
    if (this.gui_objects.quotadisplay)
      params._quota = 1;
    if (this.env.search_request)
      params._search = this.env.search_request;
    return params;
  };