alecpl
2008-09-20 c17dc6aa31aaa6e7f61bd25993be55354e428996
program/js/app.js
@@ -214,12 +214,6 @@
        this.set_page_buttons();
        // focus main window
        if (this.env.framed && window.parent)
          window.parent.focus();
        else
          window.focus();
        // init message compose form
        if (this.env.action=='compose')
          this.init_messageform();
@@ -295,8 +289,10 @@
      case 'settings':
        this.enable_command('preferences', 'identities', 'save', 'folders', true);
        
        if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity')
          this.enable_command('edit', 'add', 'delete', true);
        if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity') {
          this.enable_command('add', 'delete', this.env.multiple_identities);
          this.enable_command('edit', true);
        }
        if (this.env.action=='edit-identity' || this.env.action=='add-identity')
          this.enable_command('save', true);
@@ -388,6 +384,7 @@
      row.unread = this.env.messages[uid].unread ? true : false;
      row.replied = this.env.messages[uid].replied ? true : false;
      row.flagged = this.env.messages[uid].flagged ? true : false;
      row.forwarded = this.env.messages[uid].forwarded ? true : false;
      }
    // set eventhandler to message icon
@@ -761,7 +758,6 @@
        if (props._row.uid)
          {
          uid = props._row.uid;
          this.message_list.dont_select = true;
          // toggle flagged/unflagged
          if (this.message_list.rows[uid].flagged)
            flag = 'unflagged';
@@ -1237,6 +1233,18 @@
        if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0)
          this.command('list', id);
        }
      // Work around a bug in IE6 and IE7, see #1485309
      if ((bw.ie6 || bw.ie7) &&
          li.nextSibling &&
          (li.nextSibling.getElementsByTagName("ul").length>0) &&
          li.nextSibling.getElementsByTagName("ul")[0].style &&
          (li.nextSibling.getElementsByTagName("ul")[0].style.display!='none'))
        {
          li.nextSibling.getElementsByTagName("ul")[0].style.display = 'none';
          li.nextSibling.getElementsByTagName("ul")[0].style.display = '';
        }
      this.http_post('save-pref', '_name=collapsed_folders&_value='+escape(this.env.collapsed_folders));
      this.set_unread_count_display(id, false);
      }
@@ -1335,7 +1343,6 @@
  /*********************************************************/
  /*********     (message) list functionality      *********/
  /*********************************************************/
  // when user doble-clicks on a row
  this.show_message = function(id, safe, preview)
@@ -1531,6 +1538,98 @@
      || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter))));
  };
  // set message icon
  this.set_message_icon = function(uid)
  {
    var icn_src;
    var rows = this.message_list.rows;
    if (!rows[uid])
      return false;
    if (rows[uid].deleted && this.env.deletedicon)
      icn_src = this.env.deletedicon;
    else if (rows[uid].replied && this.env.repliedicon)
      {
      if (rows[uid].forwarded && this.env.forwardedrepliedicon)
        icn_src = this.env.forwardedrepliedicon;
      else
        icn_src = this.env.repliedicon;
      }
    else if (rows[uid].forwarded && this.env.forwardedicon)
      icn_src = this.env.forwardedicon;
    else if (rows[uid].unread && this.env.unreadicon)
      icn_src = this.env.unreadicon;
    else if (this.env.messageicon)
      icn_src = this.env.messageicon;
    if (icn_src && rows[uid].icon)
      rows[uid].icon.src = icn_src;
    icn_src = '';
    if (rows[uid].flagged && this.env.flaggedicon)
      icn_src = this.env.flaggedicon;
    else if (this.env.unflaggedicon)
      icn_src = this.env.unflaggedicon;
    if (rows[uid].flagged_icon && icn_src)
      rows[uid].flagged_icon.src = icn_src;
  }
  // set message status
  this.set_message_status = function(uid, flag, status)
    {
    var rows = this.message_list.rows;
    if (!rows[uid]) return false;
    if (flag == 'unread')
      rows[uid].unread = status;
    else if(flag == 'deleted')
      rows[uid].deleted = status;
    else if (flag == 'replied')
      rows[uid].replied = status;
    else if (flag == 'forwarded')
      rows[uid].forwarded = status;
    else if (flag == 'flagged')
      rows[uid].flagged = status;
    }
  // set message row status, class and icon
  this.set_message = function(uid, flag, status)
    {
    var rows = this.message_list.rows;
    if (!rows[uid]) return false;
    if (flag)
      this.set_message_status(uid, flag, status);
    if (rows[uid].unread && rows[uid].classname.indexOf('unread')<0)
      {
      rows[uid].classname += ' unread';
      this.set_classname(rows[uid].obj, 'unread', true);
      }
    else if (!rows[uid].unread && rows[uid].classname.indexOf('unread')>=0)
      {
      rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
      this.set_classname(rows[uid].obj, 'unread', false);
      }
    if (rows[uid].deleted && rows[uid].classname.indexOf('deleted')<0)
      {
      rows[uid].classname += ' deleted';
      this.set_classname(rows[uid].obj, 'deleted', true);
      }
    else if (!rows[uid].deleted && rows[uid].classname.indexOf('deleted')>=0)
      {
      rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, '');
      this.set_classname(rows[uid].obj, 'deleted', false);
      }
    this.set_message_icon(uid);
    }
  // move selected messages to the specified mailbox
  this.move_messages = function(mbox)
@@ -1630,20 +1729,9 @@
        else
        {
          rows[id].deleted = true;
          if (rows[id].classname.indexOf('deleted')<0)
          {
            rows[id].classname += ' deleted';
            this.set_classname(rows[id].obj, 'deleted', true);
          }
          if (this.env.read_when_deleted)
          {
            rows[id].classname = rows[id].classname.replace(/\s*unread/, '');
            this.set_classname(rows[id].obj, 'unread', false);
          }
          if (rows[id].icon && this.env.deletedicon)
            rows[id].icon.src = this.env.deletedicon;
           rows[id].unread = false;
     this.set_message(id);
        }
      }
    }
@@ -1718,88 +1806,18 @@
  this.toggle_read_status = function(flag, a_uids)
  {
    // mark all message rows as read/unread
    var icn_src;
    var rows = this.message_list.rows;
    for (var i=0; i<a_uids.length; i++)
      {
      uid = a_uids[i];
      if (rows[uid])
        {
        rows[uid].unread = (flag=='unread' ? true : false);
        if (rows[uid].classname.indexOf('unread')<0 && rows[uid].unread)
          {
          rows[uid].classname += ' unread';
          this.set_classname(rows[uid].obj, 'unread', true);
          if (this.env.unreadicon)
            icn_src = this.env.unreadicon;
          }
        else if (!rows[uid].unread)
          {
          rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
          this.set_classname(rows[uid].obj, 'unread', false);
          if (this.env.messageicon)
            icn_src = this.env.messageicon;
          }
        if (rows[uid].icon && icn_src
            && !(rows[uid].replied && this.env.repliedicon)
            && !(rows[uid].deleted && this.env.deletedicon))
          rows[uid].icon.src = icn_src;
        }
      }
      this.set_message(a_uids[i], 'unread', (flag=='unread' ? true : false));
    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
  };
  // set class to read/unread
  this.mark_as_read_from_preview = function(uid)
  {
    var icn_src;
    var rows = parent.rcmail.message_list.rows;
    if(rows[uid].unread)
      {
        rows[uid].unread = false;
        rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
        parent.rcmail.set_classname(rows[uid].obj, 'unread', false);
        if (rows[uid].replied && parent.rcmail.env.repliedicon)
          icn_src = parent.rcmail.env.repliedicon;
        else if (rows[uid].deleted && parent.rcmail.env.deletedicon)
          icn_src = parent.rcmail.env.deletedicon;
        else if (parent.rcmail.env.messageicon)
          icn_src = parent.rcmail.env.messageicon;
        if (rows[uid].icon && icn_src)
          rows[uid].icon.src = icn_src;
      }
  }
  // set image to flagged or unflagged
  this.toggle_flagged_status = function(flag, a_uids)
  {
    // mark all message rows as flagged/unflagged
    var icn_src;
    var rows = this.message_list.rows;
    for (var i=0; i<a_uids.length; i++)
      {
      uid = a_uids[i];
      if (rows[uid])
        {
        rows[uid].flagged = (flag=='flagged' ? true : false);
        if (rows[uid].flagged && this.env.flaggedicon)
          icn_src = this.env.flaggedicon;
        else if (this.env.unflaggedicon)
          icn_src = this.env.unflaggedicon;
        if (rows[uid].flagged_icon && icn_src)
          rows[uid].flagged_icon.src = icn_src;
        }
      }
      this.set_message(a_uids[i], 'flagged', (flag=='flagged' ? true : false));
    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
  };
@@ -1811,7 +1829,7 @@
    
    if (a_uids.length==1)
    {
      if (!rows.length || (rows[a_uids[0]] && rows[a_uids[0]].classname.indexOf('deleted') < 0))
      if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted))
        this.flag_as_deleted(a_uids);
      else
        this.flag_as_undeleted(a_uids);
@@ -1824,7 +1842,7 @@
    {
      uid = a_uids[i];
      if (rows[uid]) {
        if (rows[uid].classname.indexOf('deleted')<0)
        if (!rows[uid].deleted)
        {
          all_deleted = false;
          break;
@@ -1843,31 +1861,8 @@
  this.flag_as_undeleted = function(a_uids)
  {
    var icn_src;
    var rows = this.message_list ? this.message_list.rows : new Array();
    for (var i=0; i<a_uids.length; i++)
    {
      uid = a_uids[i];
      if (rows[uid]) {
        rows[uid].deleted = false;
        if (rows[uid].classname.indexOf('deleted') > 0)
        {
          rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, '');
          this.set_classname(rows[uid].obj, 'deleted', false);
        }
        if (rows[uid].unread && this.env.unreadicon)
          icn_src = this.env.unreadicon;
        else if (rows[uid].replied && this.env.repliedicon)
          icn_src = this.env.repliedicon;
        else if (this.env.messageicon)
          icn_src = this.env.messageicon;
        if (rows[uid].icon && icn_src)
          rows[uid].icon.src = icn_src;
      }
    }
      this.set_message(a_uids[i], 'deleted', false);
    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=undelete');
    return true;
@@ -1885,22 +1880,7 @@
      uid = a_uids[i];
      if (rows[uid])
        {
        rows[uid].deleted = true;
        if (rows[uid].classname.indexOf('deleted')<0)
          {
          rows[uid].classname += ' deleted';
          this.set_classname(rows[uid].obj, 'deleted', true);
          }
        if (this.env.read_when_deleted)
        {
          rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
          this.set_classname(rows[uid].obj, 'unread', false);
        }
        if (rows[uid].icon && this.env.deletedicon)
          rows[uid].icon.src = this.env.deletedicon;
   this.set_message(uid, 'deleted', true);
        if (rows[uid].unread)
          r_uids[r_uids.length] = uid;
        }
@@ -1932,12 +1912,7 @@
        {
        rows[uid].unread = false;
        rows[uid].read = true;
        rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
        this.set_classname(rows[uid].obj, 'unread', false);
        if (rows[uid].icon)
          rows[uid].icon.src = this.env.deletedicon;
   this.set_message(uid);
        }
      }
  };
@@ -2335,7 +2310,6 @@
  /*********     keyboard live-search methods      *********/
  /*********************************************************/
  // handler for keyboard events on address-fields
  this.ksearch_keypress = function(e, obj)
    {
@@ -2555,7 +2529,6 @@
  /*********************************************************/
  /*********         address book methods          *********/
  /*********************************************************/
  this.contactlist_keypress = function(list)
    {
@@ -2894,6 +2867,7 @@
      if (this.env.folder && name != '')
        name = this.env.folder+this.env.delimiter+name;
      this.set_busy(true, 'foldercreating');
      this.http_post('create-folder', '_name='+urlencode(name), true);
      }
    else if (form.elements['_folder_name'])
@@ -2968,6 +2942,7 @@
        if (this.name_input.__parent)
          newname = this.name_input.__parent + this.env.delimiter + newname;
        this.set_busy(true, 'folderrenaming');
        this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname), true);
        }
      }
@@ -2987,7 +2962,8 @@
    if (folder && confirm(this.get_label('deletefolderconfirm')))
      {
      this.http_post('delete-folder', '_mboxes='+urlencode(folder));
      this.set_busy(true, 'folderdeleting');
      this.http_post('delete-folder', '_mboxes='+urlencode(folder), true);
      this.set_env('folder', null);
      if (this.gui_objects.createfolderhint)
@@ -3469,6 +3445,7 @@
    this.env.messages[uid] = {deleted:flags.deleted?1:0,
                              replied:flags.replied?1:0,
                              unread:flags.unread?1:0,
               forwarded:flags.forwarded?1:0,
                              flagged:flags.flagged?1:0};
    
    var row = document.createElement('TR');
@@ -3478,10 +3455,21 @@
    if (this.message_list.in_selection(uid))
      row.className += ' selected';
    var icon = flags.deleted && this.env.deletedicon ? this.env.deletedicon:
               (flags.unread && this.env.unreadicon ? this.env.unreadicon :
               (flags.replied && this.env.repliedicon ? this.env.repliedicon : this.env.messageicon));
    var icon = this.env.messageicon;
    if (flags.deleted && this.env.deletedicon)
      icon = this.env.deletedicon;
    else if (flags.replied && this.env.repliedicon)
      {
      if (flags.forwarded && this.env.forwardedrepliedicon)
        icon = this.env.forwardedrepliedicon;
      else
        icon = this.env.repliedicon;
      }
    else if (flags.forwarded && this.env.forwardedicon)
      icon = this.env.forwardedicon;
    else if(flags.unread && this.env.unreadicon)
      icon = this.env.unreadicon;
    var col = document.createElement('TD');
    col.className = 'icon';
    col.innerHTML = icon ? '<img src="'+icon+'" alt="" />' : '';
@@ -3513,6 +3501,14 @@
    row.appendChild(col);
    this.message_list.insert_row(row, attop);
    // remove 'old' row
    if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize)
      {
   var uid = this.message_list.get_last_row();
        this.message_list.remove_row(uid);
   this.message_list.clear_selection(uid);
      }
    };
@@ -3608,12 +3604,6 @@
      }
    };
  // update parent's mailboxlist (from preview)
  this.set_unread_count_from_preview = function(mbox, count, set_title)
  {
    parent.rcmail.set_unread_count(mbox, count, set_title);
  }
  // add row to contacts list
  this.add_contact_row = function(cid, cols, select)
    {
@@ -3648,13 +3638,21 @@
  this.toggle_editor = function(checkbox, textAreaId)
    {
    var ischecked = checkbox.checked;
    var composeElement = document.getElementById(textAreaId);
    if (ischecked)
      {
        tinyMCE.execCommand('mceAddControl', true, textAreaId);
      var existingPlainText = composeElement.value;
      var htmlText = "<pre>" + existingPlainText + "</pre>";
      composeElement.value = htmlText;
      tinyMCE.execCommand('mceAddControl', true, textAreaId);
      }
    else
      {
        tinyMCE.execCommand('mceRemoveControl', true, textAreaId);
      var thisMCE = tinyMCE.get(textAreaId);
      var existingHtml = thisMCE.getContent();
      this.html2plain(existingHtml, textAreaId);
      tinyMCE.execCommand('mceRemoveControl', true, textAreaId);
      }
    };
@@ -3683,6 +3681,7 @@
      }
    };
  // display all-headers row and fetch raw message headers
  this.load_headers = function(elem)
    {
@@ -3697,7 +3696,7 @@
    // fetch headers only once
    if (!this.gui_objects.all_headers_box.innerHTML)
      {
      this.set_busy(true, 'loading');
      this.display_message(this.get_label('loading'), 'loading', true);
      this.http_post('headers', '_uid='+this.env.uid);
      }
    }
@@ -3713,6 +3712,32 @@
    this.set_classname(elem, 'show-headers', true);
    this.gui_objects.all_headers_row.style.display = 'none';
    elem.onclick = function() { rcmail.load_headers(elem); }
    }
  /********************************************************/
  /*********  html to text conversion functions   *********/
  /********************************************************/
  this.html2plain = function(htmlText, id)
    {
    var http_request = new rcube_http_request();
    var url = this.env.bin_path+'html2text.php';
    var rcmail = this;
    this.set_busy(true, 'converting');
    console.log('HTTP POST: '+url);
    http_request.onerror = function(o) { rcmail.http_error(o); };
    http_request.oncomplete = function(o) { rcmail.set_text_value(o, id); };
    http_request.POST(url, htmlText, 'application/octet-stream');
    }
  this.set_text_value = function(httpRequest, id)
    {
    this.set_busy(false);
    document.getElementById(id).value = httpRequest.get_text();
    console.log(httpRequest.get_text());
    }
@@ -4150,4 +4175,3 @@
    window.setTimeout('if (window[\''+o+'\'] && window[\''+o+'\'].init) { '+o+'.init(); }',
                      bw.win ? 500 : 200);
  }