svncommit
2006-06-19 1966c53255495890dd7f25c31bac73d97ecc3291
program/js/app.js
@@ -29,6 +29,7 @@
  this.commands = new Object();
  this.selection = new Array();
  this.last_selected = 0;
  this.in_message_list = false;
  // create public reference to myself
  rcube_webmail_client = this;
@@ -141,7 +142,13 @@
          }  
        if (this.env.action=='compose')
          {
          this.enable_command('add-attachment', 'send-attachment', 'send', true);
          if (this.env.spellcheck)
            this.enable_command('spellcheck', true);
     if (this.env.drafts_mailbox)
       this.enable_command('savedraft', true);
          }
          
        if (this.env.messagecount)
          this.enable_command('select-all', 'select-none', 'sort', 'expunge', true);
@@ -254,15 +261,29 @@
    };
  // reset last clicked if user clicks on anything other than the message table
  this.reset_click = function()
    {
   this.in_message_list = false;
   };
  this.reset_click = function() {
    this.in_message_list = false;
   for (var n=0; n<this.selection.length; n++) {
      id = this.selection[n];
      if (this.list_rows[id].obj) {
        this.set_classname(this.list_rows[id].obj, 'selected', false);
      this.set_classname(this.list_rows[id].obj, 'unfocused', true);
     }
    }
  };
   
  this.click_on_list = function(e)
    {
    if (!e)
      e = window.event;
    for (var n=0; n<this.selection.length; n++) {
      id = this.selection[n];
      if (this.list_rows[id].obj) {
        this.set_classname(this.list_rows[id].obj, 'selected', true);
      this.set_classname(this.list_rows[id].obj, 'unfocused', false);
     }
    }
    this.in_message_list = true;
    e.cancelBubble = true;
@@ -328,8 +349,12 @@
      for(var r=0; r<msg_list.tBodies[0].childNodes.length; r++)
        {
        row = msg_list.tBodies[0].childNodes[r];
        while (row && (row.nodeType != 1 || row.style.display == 'none')) {
          row = row.nextSibling;
          r++;
        }
        //row = msg_list.tBodies[0].rows[r];
        this.init_message_row(row);
        if (row) this.init_message_row(row);
        }
      }
      
@@ -653,7 +678,17 @@
          {
          var uid = this.get_single_uid();
          if (uid && (!this.env.uid || uid != this.env.uid))
            this.show_message(uid);
       {
            if (this.env.mailbox==this.env.drafts_mailbox)
              {
              this.set_busy(true);
              location.href = this.env.comm_path+'&_action=compose&_draft_uid='+uid+'&_mbox='+escape(this.env.mailbox);
              }
            else
              {
              this.show_message(uid);
         }
       }
          }
        else if (this.task=='addressbook')
          {
@@ -810,9 +845,14 @@
      
      case 'compose':
        var url = this.env.comm_path+'&_action=compose';
        if (this.task=='mail' && this.env.mailbox==this.env.drafts_mailbox)
          {
          var uid = this.get_single_uid();
          url += '&_draft_uid='+uid+'&_mbox='+escape(this.env.mailbox);
          }
        // modify url if we're in addressbook
        if (this.task=='addressbook')
        else if (this.task=='addressbook')
          {
          url = this.get_task_url('mail', url);            
          var a_cids = new Array();
@@ -856,7 +896,25 @@
          parent.location.href = url;
        else
          location.href = url;
        break;
        break;
      case 'spellcheck':
        if (this.env.spellcheck && this.env.spellcheck.spellCheck)
          this.env.spellcheck.spellCheck(this.env.spellcheck.check_link);
        break;
      case 'savedraft':
        if (!this.gui_objects.messageform)
          break;
   // if saving Drafts is disabled in main.inc.php
   if (!this.env.drafts_mailbox)
     break;
        this.set_busy(true, 'savingmessage');
        var form = this.gui_objects.messageform;
        form.submit();
        break;
      case 'send':
        if (!this.gui_objects.messageform)
@@ -868,6 +926,7 @@
        // all checks passed, send message
        this.set_busy(true, 'sendingmessage');
        var form = this.gui_objects.messageform;
   form._draft.value='';
        form.submit();
        break;
@@ -989,7 +1048,7 @@
  // set command enabled or disabled
  this.enable_command = function()
    {
    var args = this.enable_command.arguments;
    var args = arguments;
    if(!args.length) return -1;
    var command;
@@ -1001,6 +1060,7 @@
      this.commands[command] = enable;
      this.set_button(command, (enable ? 'act' : 'pas'));
      }
      return true;
    };
@@ -1142,7 +1202,15 @@
    // row was double clicked
    if (this.task=='mail' && this.list_rows && this.list_rows[id].clicked && this.in_selection(id))
      {
      this.show_message(id);
      if (this.env.mailbox==this.env.drafts_mailbox)
        {
        this.set_busy(true);
        location.href = this.env.comm_path+'&_action=compose&_draft_uid='+id+'&_mbox='+escape(this.env.mailbox);
        }
      else
        {
        this.show_message(id);
        }
      return false;
      }
    else if (this.task=='addressbook')
@@ -1247,7 +1315,7 @@
      if (!this.in_selection(id))  // select row
        {
        this.selection[this.selection.length] = id;
        this.set_classname(this.list_rows[id].obj, 'selected', true);
        this.set_classname(this.list_rows[id].obj, 'selected', true);
        }
      else  // unselect row
        {
@@ -1256,6 +1324,7 @@
        var a_post = this.selection.slice(p+1, this.selection.length);
        this.selection = a_pre.concat(a_post);
        this.set_classname(this.list_rows[id].obj, 'selected', false);
        this.set_classname(this.list_rows[id].obj, 'unfocused', false);
        }
      selected = (this.selection.length==1);
      }
@@ -1263,8 +1332,18 @@
    // enable/disable commands for message
    if (this.task=='mail')
      {
      this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected);
      this.enable_command('delete', 'moveto', this.selection.length>0 ? true : false);
      if (this.env.mailbox==this.env.drafts_mailbox)
   {
   //alert(this.env.mailbox);
   //this.disable_command('reply', 'reply-all', 'forward', 'print', 'moveto');
   this.enable_command('show', selected);
   this.enable_command('delete', this.selection.length>0 ? true : false);
        }
      else
        {
        this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected);
        this.enable_command('delete', 'moveto', this.selection.length>0 ? true : false);
        }
      }
    else if (this.task=='addressbook')
      {
@@ -1328,9 +1407,10 @@
  this.clear_selection = function()
    {
    for(var n=0; n<this.selection.length; n++)
      if (this.list_rows[this.selection[n]])
      if (this.list_rows[this.selection[n]]) {
        this.set_classname(this.list_rows[this.selection[n]].obj, 'selected', false);
        this.set_classname(this.list_rows[this.selection[n]].obj, 'unfocused', false);
     }
    this.selection = new Array();    
    };
@@ -1355,9 +1435,11 @@
    // reset selection first
    this.clear_selection();
    
    for (var n in this.list_rows)
    for (var n in this.list_rows) {
      if (!filter || this.list_rows[n][filter]==true)
      this.highlight_row(n, true);
        this.highlight_row(n, true);
    }
    return true;
    };
    
@@ -1520,6 +1602,7 @@
    // send request to server
    var url = '_mbox='+escape(mbox);
    this.http_request('purge', url+add_url, lock);
    return true;
    };
    
@@ -1611,10 +1694,11 @@
      this.permanently_remove_messages();
    // if there isn't a defined trash mailbox and the config is set to flag for deletion
    else if (!this.env.trash_mailbox && this.env.flag_for_deletion) {
      this.mark_message('delete',this.env.uid);
      flag = 'delete';
      this.mark_message(flag);
      if(this.env.action=="show"){
        this.command('nextmessage','',this);
      } else {
      } else if (this.selection.length == 1) {
        next_row = this.get_next_row();
        prev_row = this.get_prev_row();
        new_row = (next_row) ? next_row : prev_row;
@@ -1653,11 +1737,9 @@
          break;
        case 'delete':
        case 'undelete':
          this.toggle_delete_status(flag,a_uids);
          this.toggle_delete_status(a_uids);
          break;
      }
    // send request to server
    this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
    };
  // set class to read/unread
@@ -1694,10 +1776,11 @@
          this.message_rows[uid].icon.src = icn_src;
        }
      }
      this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
  }
  
  // mark all message rows as deleted/undeleted
  this.toggle_delete_status = function(flag, a_uids) {
  this.toggle_delete_status = function(a_uids) {
    if (this.env.read_when_deleted) {
      this.toggle_read_status('read',a_uids);
    }
@@ -1705,41 +1788,86 @@
    if (this.env.action == "show")
      return false;
    var icn_src;
    for (var i=0; i<a_uids.length; i++)
      {
    if (a_uids.length==1){
      if(this.message_rows[a_uids[0]].classname.indexOf('deleted') < 0 ){
         this.flag_as_deleted(a_uids)
      } else {
         this.flag_as_undeleted(a_uids)
      }
      return true;
    }
    var all_deleted = true;
    for (var i=0; i<a_uids.length; i++) {
      uid = a_uids[i];
      if (this.message_rows[uid])
        {
        this.message_rows[uid].deleted = (flag=='undelete' ? false : true);
        if (this.message_rows[uid].classname.indexOf('deleted')<0 && this.message_rows[uid].deleted)
          {
          this.message_rows[uid].classname += ' deleted';
          this.set_classname(this.message_rows[uid].obj, 'deleted', true);
          if (this.env.deletedicon)
            icn_src = this.env.deletedicon;
          }
        else if (!this.message_rows[uid].deleted)
          {
          this.message_rows[uid].classname = this.message_rows[uid].classname.replace(/\s*deleted/, '');
          this.set_classname(this.message_rows[uid].obj, 'deleted', false);
          if (this.message_rows[uid].unread && this.env.unreadicon)
            icn_src = this.env.unreadicon;
          else if (this.message_rows[uid].replied && this.env.repliedicon)
            icn_src = this.env.repliedicon;
          else if (this.env.messageicon)
            icn_src = this.env.messageicon;
          }
        if (this.message_rows[uid].icon && icn_src)
          this.message_rows[uid].icon.src = icn_src;
      if (this.message_rows[uid]) {
        if (this.message_rows[uid].classname.indexOf('deleted')<0) {
          all_deleted = false;
          break;
        }
      }
    }
    if (all_deleted)
      this.flag_as_undeleted(a_uids);
    else
      this.flag_as_deleted(a_uids);
    return true;
  }
  this.flag_as_undeleted = function(a_uids){
    // if deleting message from "view message" don't bother with delete icon
    if (this.env.action == "show")
      return false;
    var icn_src;
    for (var i=0; i<a_uids.length; i++) {
      uid = a_uids[i];
      if (this.message_rows[uid]) {
        this.message_rows[uid].deleted = false;
        if (this.message_rows[uid].classname.indexOf('deleted') > 0) {
          this.message_rows[uid].classname = this.message_rows[uid].classname.replace(/\s*deleted/, '');
          this.set_classname(this.message_rows[uid].obj, 'deleted', false);
        }
        if (this.message_rows[uid].unread && this.env.unreadicon)
          icn_src = this.env.unreadicon;
        else if (this.message_rows[uid].replied && this.env.repliedicon)
          icn_src = this.env.repliedicon;
        else if (this.env.messageicon)
          icn_src = this.env.messageicon;
        if (this.message_rows[uid].icon && icn_src)
          this.message_rows[uid].icon.src = icn_src;
      }
    }
    this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag=undelete');
    return true;
  }
  this.flag_as_deleted = function(a_uids) {
    // if deleting message from "view message" don't bother with delete icon
    if (this.env.action == "show")
      return false;
    for (var i=0; i<a_uids.length; i++) {
      uid = a_uids[i];
      if (this.message_rows[uid]) {
        this.message_rows[uid].deleted = true;
        if (this.message_rows[uid].classname.indexOf('deleted')<0) {
          this.message_rows[uid].classname += ' deleted';
          this.set_classname(this.message_rows[uid].obj, 'deleted', true);
        }
        if (this.message_rows[uid].icon && this.env.deletedicon)
          this.message_rows[uid].icon.src = this.env.deletedicon;
      }
    }
    this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag=delete');
    return true;
  }
  /*********************************************************/
  /*********        message compose methods        *********/
@@ -1828,12 +1956,15 @@
    var message = input_message ? input_message.value : '';
    var sig, p;
    if (!this.env.identity)
      this.env.identity = id
    // remove the 'old' signature
    if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity])
      {
      sig = this.env.signatures[this.env.identity];
      if (sig.indexOf('-- ')!=0)
        sig = '-- \n'+sig;
      if (sig.indexOf('--')!=0)
        sig = '--\n'+sig;
      p = message.lastIndexOf(sig);
      if (p>=0)
@@ -1844,8 +1975,8 @@
    if (this.env.signatures && this.env.signatures[id])
      {
      sig = this.env.signatures[id];
      if (sig.indexOf('-- ')!=0)
        sig = '-- \n'+sig;
      if (sig.indexOf('--')!=0)
        sig = '--\n'+sig;
      message += '\n'+sig;
      }
@@ -1853,6 +1984,7 @@
      input_message.value = message;
      
    this.env.identity = id;
    return true;
    };
@@ -1880,6 +2012,8 @@
    // clear upload form
    if (!a && this.gui_objects.attachmentform && this.gui_objects.attachmentform!=this.gui_objects.messageform)
      this.gui_objects.attachmentform.reset();
    return true;
    };
@@ -1929,6 +2063,7 @@
    
    // set reference to the form object
    this.gui_objects.attachmentform = form;
    return true;
    };
@@ -1942,6 +2077,7 @@
    var li = document.createElement('LI');
    li.innerHTML = name;
    this.gui_objects.attachmentlist.appendChild(li);
    return true;
    };
@@ -1950,6 +2086,8 @@
    {
    if (value)
      this.http_request('addcontact', '_address='+value);
    return true;
    };
  // send remote request to search mail
@@ -1961,6 +2099,7 @@
      this.set_busy(true, 'searching');
      this.http_request('search', '_search='+value+'&_mbox='+mbox, true);
      }
    return true;
    };
  // reset quick-search form
@@ -1970,6 +2109,7 @@
      this.gui_objects.qsearchbox.value = '';
      
    this.env.search_request = null;
    return true;
    };
    
@@ -2012,6 +2152,7 @@
          highlight.removeAttribute('id');
          //highlight.removeAttribute('class');
          this.set_classname(highlight, 'selected', false);
          this.set_classname(highlight, 'unfocused', false);
          }
        if (next)
@@ -2271,6 +2412,7 @@
      this.set_busy(true);
      target.location.href = this.env.comm_path+'&_action='+action+'&_cid='+cid+add_url;
      }
    return true;
    };
@@ -2307,6 +2449,7 @@
    // send request to server
    this.http_request('delete', '_cid='+a_cids.join(',')+'&_from='+(this.env.action ? this.env.action : ''));
    return true;
    };
@@ -2317,10 +2460,11 @@
      return false;
      
    var row = this.contact_rows[cid].obj;
    for (var c=0; c<cols_arr.length; c++)
    for (var c=0; c<cols_arr.length; c++){
      if (row.cells[c])
        row.cells[c].innerHTML = cols_arr[c];
    }
    return true;
    };
  
  
@@ -2341,6 +2485,8 @@
    if (action == 'ldappublicsearch')
      target.location.href = this.env.comm_path+'&_action='+action+add_url;
    return true;
    };
 
  // add ldap contacts to address book
@@ -2378,7 +2524,7 @@
  this.load_identity = function(id, action)
    {
    if (action=='edit-identity' && (!id || id==this.env.iid))
      return;
      return false;
    var add_url = '';
    var target = window;
@@ -2394,6 +2540,7 @@
      this.set_busy(true);
      target.location.href = this.env.comm_path+'&_action='+action+'&_iid='+id+add_url;
      }
    return true;
    };
@@ -2418,9 +2565,10 @@
    // if (this.env.framed && id)
      this.set_busy(true);
      location.href = this.env.comm_path+'&_action=delete-identity&_iid='+id;
      location.href = this.env.comm_path+'&_action=delete-identity&_iid='+id;
    // else if (id)
    //  this.http_request('delete-identity', '_iid='+id);
    return true;
    };
@@ -2743,8 +2891,10 @@
      var current_li = document.getElementById('rcmbx'+s_current);
      var mbox_li = document.getElementById('rcmbx'+s_mbox);
      
      if (current_li)
      if (current_li) {
        this.set_classname(current_li, 'selected', false);
        this.set_classname(current_li, 'unfocused', false);
        }
      if (mbox_li)
        this.set_classname(mbox_li, 'selected', true);
      }