thomascube
2006-08-23 6c76c91951d259f59b2b7a42b8fe895dcc0ef21b
program/js/app.js
@@ -18,7 +18,6 @@
var CONTROL_KEY = 1;
var SHIFT_KEY = 2;
var CONTROL_SHIFT_KEY = 3;
var DRAFT_AUTOSAVE = 5; // Minutes
var rcube_webmail_client;
@@ -40,10 +39,8 @@
  // webmail client settings
  this.dblclick_time = 600;
  this.message_time = 5000;
  this.request_timeout = 180000;
  this._interval = 60000;
  this.mbox_expression = new RegExp('[^0-9a-z\-_]', 'gi');
  this.env.blank_img = 'skins/default/images/blank.gif';
  
  // mimetypes supported by the browser (default settings)
  this.mimetypes = new Array('text/plain', 'text/html', 'text/xml',
@@ -51,12 +48,16 @@
                             'application/x-javascript', 'application/pdf',
                             'application/x-shockwave-flash');
  // default environment vars
  this.env.keep_alive = 60;        // seconds
  this.env.request_timeout = 180;  // seconds
  this.env.draft_autosave = 300;   // seconds
  // set environment variable
  this.set_env = function(name, value)
    {
    //if (!this.busy)
      this.env[name] = value;
    this.env[name] = value;
    };
@@ -246,24 +247,28 @@
    // load body click event
    document.onmousedown = function(){ return rcube_webmail_client.reset_click(); };
    document.onkeydown   = function(e){ return rcube_webmail_client.key_pressed(e, msg_list_frame); };
    // set default keep alive interval
    if (!this.keep_alive_interval)
      this.keep_alive_interval = this._interval;
    
    // flag object as complete
    this.loaded = true;
    // show message
    if (this.pending_message)
      this.display_message(this.pending_message[0], this.pending_message[1]);
    // start interval for keep-alive/recent_check signal
    if (this.keep_alive_interval && this.task=='mail' && this.gui_objects.messagelist)
      this._int = setInterval(this.ref+'.check_for_recent()', this.keep_alive_interval);
    else if (this.task!='login')
      this._int = setInterval(this.ref+'.send_keep_alive()', this.keep_alive_interval);
    // start keep-alive interval
    this.start_keepalive();
    };
  // start interval for keep-alive/recent_check signal
  this.start_keepalive = function()
    {
    if (this.env.keep_alive && this.task=='mail' && this.gui_objects.messagelist)
      this._int = setInterval(this.ref+'.check_for_recent()', this.env.keep_alive * 1000);
    else if (this.env.keep_alive && this.task!='login')
      this._int = setInterval(this.ref+'.send_keep_alive()', this.env.keep_alive * 1000);
    }
  // reset last clicked if user clicks on anything other than the message table
  this.reset_click = function()
@@ -706,7 +711,7 @@
            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);
              location.href = this.env.comm_path+'&_action=compose&_draft_uid='+uid+'&_mbox='+urlencode(this.env.mailbox);
              }
            else
              this.show_message(uid);
@@ -873,8 +878,9 @@
       
        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);
          var uid;
          if (uid = this.get_single_uid())
            url += '&_draft_uid='+uid+'&_mbox='+urlencode(this.env.mailbox);
          } 
        // modify url if we're in addressbook
        else if (this.task=='addressbook')
@@ -951,6 +957,9 @@
        if (!this.check_compose_input())
          break;
        // Reset the auto-save timer
        self.clearTimeout(this.save_timer);
        // all checks passed, send message
        this.set_busy(true, 'sendingmessage');
@@ -958,6 +967,9 @@
        form.target = "savetarget";     
        form._draft.value = '';
        form.submit();
        // clear timeout (sending could take longer)
        clearTimeout(this.request_timer);
        break;
      case 'add-attachment':
@@ -980,7 +992,7 @@
        if (uid = this.get_single_uid())
          {
          this.set_busy(true);
          location.href = this.env.comm_path+'&_action=compose&_reply_uid='+uid+'&_mbox='+escape(this.env.mailbox)+(command=='reply-all' ? '&_all=1' : '');
          location.href = this.env.comm_path+'&_action=compose&_reply_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(command=='reply-all' ? '&_all=1' : '');
          }
        break;      
@@ -989,7 +1001,7 @@
        if (uid = this.get_single_uid())
          {
          this.set_busy(true);
          location.href = this.env.comm_path+'&_action=compose&_forward_uid='+uid+'&_mbox='+escape(this.env.mailbox);
          location.href = this.env.comm_path+'&_action=compose&_forward_uid='+uid+'&_mbox='+urlencode(this.env.mailbox);
          }
        break;
        
@@ -997,7 +1009,7 @@
        var uid;
        if (uid = this.get_single_uid())
          {
          this.printwin = window.open(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+escape(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : ''));
          this.printwin = window.open(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : ''));
          if (this.printwin)
            setTimeout(this.ref+'.printwin.focus()', 20);
          }
@@ -1007,7 +1019,7 @@
        var uid;
        if (uid = this.get_single_uid())
          {          
          this.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+this.env.uid+'&_mbox='+escape(this.env.mailbox));
          this.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox));
          if (this.sourcewin)
            setTimeout(this.ref+'.sourcewin.focus()', 20);
          }
@@ -1022,7 +1034,7 @@
        if (!props && this.gui_objects.qsearchbox)
          props = this.gui_objects.qsearchbox.value;
        if (props)
          this.qsearch(escape(props), this.env.mailbox);
          this.qsearch(urlencode(props), this.env.mailbox);
        break;
      // reset quicksearch        
@@ -1130,8 +1142,8 @@
      clearTimeout(this.request_timer);
    // set timer for requests
    if (a && this.request_timeout)
      this.request_timer = setTimeout(this.ref+'.request_timed_out()', this.request_timeout);
    if (a && this.env.request_timeout)
      this.request_timer = setTimeout(this.ref+'.request_timed_out()', this.env.request_timeout * 1000);
    };
@@ -1249,7 +1261,7 @@
      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);
        location.href = this.env.comm_path+'&_action=compose&_draft_uid='+id+'&_mbox='+urlencode(this.env.mailbox);
        }
      else
        {
@@ -1509,7 +1521,7 @@
    if (id)
      {
      this.set_busy(true, 'loading');
      target.location.href = this.env.comm_path+'&_action=show&_uid='+id+'&_mbox='+escape(this.env.mailbox)+add_url;
      target.location.href = this.env.comm_path+'&_action=show&_uid='+id+'&_mbox='+urlencode(this.env.mailbox)+add_url;
      }
    };
@@ -1581,7 +1593,7 @@
    if (mbox)
      {
      this.set_busy(true, 'loading');
      target.location.href = this.env.comm_path+'&_mbox='+escape(mbox)+(page ? '&_page='+page : '')+add_url;
      target.location.href = this.env.comm_path+'&_mbox='+urlencode(mbox)+(page ? '&_page='+page : '')+add_url;
      }
    };
@@ -1593,7 +1605,7 @@
    this.clear_message_list();
    // send request to server
    var url = '_mbox='+escape(mbox)+(page ? '&_page='+page : '');
    var url = '_mbox='+urlencode(mbox)+(page ? '&_page='+page : '');
    this.set_busy(true, 'loading');
    this.http_request('list', url+add_url, true);
    };
@@ -1645,7 +1657,7 @@
       }
    // send request to server
    var url = '_mbox='+escape(mbox);
    var url = '_mbox='+urlencode(mbox);
    this.http_request('expunge', url+add_url, lock);
    };
@@ -1667,7 +1679,7 @@
       }
    // send request to server
    var url = '_mbox='+escape(mbox);
    var url = '_mbox='+urlencode(mbox);
    this.http_request('purge', url+add_url, lock);
    return true;
    };
@@ -1724,7 +1736,7 @@
      this.set_busy(true, 'movingmessage');
      }
    // send request to server
    this.http_request('moveto', '_uid='+a_uids.join(',')+'&_mbox='+escape(this.env.mailbox)+'&_target_mbox='+escape(mbox)+'&_from='+(this.env.action ? this.env.action : ''), lock);
    this.http_request('moveto', '_uid='+a_uids.join(',')+'&_mbox='+urlencode(this.env.mailbox)+'&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : ''), lock);
    };
  this.permanently_remove_messages = function() {
@@ -1755,7 +1767,7 @@
      if (new_row) this.select_row(new_row.uid,false,false);
    // send request to server
    this.http_request('delete', '_uid='+a_uids.join(',')+'&_mbox='+escape(this.env.mailbox)+'&_from='+(this.env.action ? this.env.action : ''));
    this.http_request('delete', '_uid='+a_uids.join(',')+'&_mbox='+urlencode(this.env.mailbox)+'&_from='+(this.env.action ? this.env.action : ''));
  }
    
    
@@ -2015,7 +2027,8 @@
  this.auto_save_start = function()
    {
    this.save_timer = self.setTimeout('rcmail.command("savedraft","",this)', DRAFT_AUTOSAVE * 60000);
    if (this.env.draft_autosave)
      this.save_timer = self.setTimeout(this.ref+'.command("savedraft")', this.env.draft_autosave * 1000);
    };
@@ -2168,7 +2181,7 @@
  // add file name to attachment list
  // called from upload page
  this.add2attachment_list = function(name,content)
  this.add2attachment_list = function(name, content)
    {
    if (!this.gui_objects.attachmentlist)
      return false;
@@ -2188,13 +2201,13 @@
    var list = this.gui_objects.attachmentlist.getElementsByTagName("li");
    for (i=0;i<list.length;i++)
      if (list[i].id == name)
   this.gui_objects.attachmentlist.removeChild(list[i]);
        this.gui_objects.attachmentlist.removeChild(list[i]);
    };
  this.remove_attachment = function(name)
    {
    if (name)
      this.http_request('remove-attachment', '_filename='+escape(name));
      this.http_request('remove-attachment', '_file='+urlencode(name));
    return true;
    };
@@ -2707,7 +2720,7 @@
      name = form.elements['_folder_name'].value;
    if (name)
      this.http_request('create-folder', '_name='+escape(name), true);
      this.http_request('create-folder', '_name='+urlencode(name), true);
    else if (form.elements['_folder_name'])
      form.elements['_folder_name'].focus();
    };
@@ -2730,7 +2743,7 @@
      }
    if (oldname && newname)
      this.http_request('rename-folder', '_folder_oldname='+escape(oldname)+'&_folder_newname='+escape(newname));
      this.http_request('rename-folder', '_folder_oldname='+urlencode(oldname)+'&_folder_newname='+urlencode(newname));
    };
@@ -2752,7 +2765,7 @@
    if (id && (row = document.getElementById(id)))
      {
      this.name_input = document.createElement('INPUT');
      this.name_input.value = this.env.subscriptionrows[id];
      this.name_input.value = this.env.subscriptionrows[id][1];
      this.name_input.style.width = '100%';
      this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
      
@@ -2771,7 +2784,7 @@
    {
    var cell = this.name_input ? this.name_input.parentNode : null;
    if (cell && this.edit_folder)
      cell.innerHTML = this.env.subscriptionrows[this.edit_folder];
      cell.innerHTML = this.env.subscriptionrows[this.edit_folder][1];
      
    this.edit_folder = null;
    };
@@ -2787,7 +2800,7 @@
      {
      var newname = this.name_input ? this.name_input.value : null;
      if (this.edit_folder && newname)
        this.http_request('rename-folder', '_folder_oldname='+escape(this.env.subscriptionrows[this.edit_folder])+'&_folder_newname='+escape(newname));
        this.http_request('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname));
      }
    // escape
    else if (key==27)
@@ -2802,12 +2815,12 @@
     this.reset_folder_rename();
    
    if (folder)
      this.http_request('delete-folder', '_mboxes='+escape(folder));
      this.http_request('delete-folder', '_mboxes='+urlencode(folder));
    };
  // add a new folder to the subscription list by cloning a folder row
  this.add_folder_row = function(name, replace)
  this.add_folder_row = function(name, display_name, replace)
    {
    name = name.replace('\\',"");
    if (!this.gui_objects.subscriptionlist)
@@ -2838,10 +2851,10 @@
      }
    // add to folder/row-ID map
    this.env.subscriptionrows[row.id] = name;
    this.env.subscriptionrows[row.id] = [name, display_name];
    // set folder name
    row.cells[0].innerHTML = name;
    row.cells[0].innerHTML = display_name;
    if (row.cells[1] && row.cells[1].firstChild.tagName=='INPUT')
      {
      row.cells[1].firstChild.value = name;
@@ -2866,13 +2879,13 @@
  // replace an existing table row with a new folder line
  this.replace_folder_row = function(newfolder, oldfolder)
  this.replace_folder_row = function(oldfolder, newfolder, display_name)
    {
    var id = this.get_folder_row_id(oldfolder);
    var row = document.getElementById(id);
    
    // replace an existing table row (if found)
    this.add_folder_row(newfolder, row);
    this.add_folder_row(newfolder, display_name, row);
    this.env.subscriptionrows[id] = null;
    
    // rename folder in rename-folder dropdown
@@ -2883,7 +2896,7 @@
        {
        if (elm.options[i].value == oldfolder)
          {
          elm.options[i].text = newfolder;
          elm.options[i].text = display_name;
          elm.options[i].value = newfolder;
          break;
          }
@@ -2928,7 +2941,7 @@
    if ((form = this.gui_objects.editform) && form.elements['_unsubscribed'])
      this.change_subscription('_unsubscribed', '_subscribed', 'subscribe');
    else if (folder)
      this.http_request('subscribe', '_mboxes='+escape(folder));
      this.http_request('subscribe', '_mboxes='+urlencode(folder));
    };
@@ -2938,7 +2951,7 @@
    if ((form = this.gui_objects.editform) && form.elements['_subscribed'])
      this.change_subscription('_subscribed', '_unsubscribed', 'unsubscribe');
    else if (folder)
      this.http_request('unsubscribe', '_mboxes='+escape(folder));
      this.http_request('unsubscribe', '_mboxes='+urlencode(folder));
    };
    
@@ -2972,7 +2985,7 @@
          list_to[index] = new Option(a_folders[n]);
          }
          
        this.http_request(action, '_mboxes='+escape(a_folders.join(',')));
        this.http_request(action, '_mboxes='+urlencode(a_folders.join(',')));
        }
      }
      
@@ -2982,7 +2995,7 @@
  this.get_folder_row_id = function(folder)
    {
    for (var id in this.env.subscriptionrows)
      if (this.env.subscriptionrows[id]==folder)
      if (this.env.subscriptionrows[id] && this.env.subscriptionrows[id][0] == folder)
        break;
        
    return id;
@@ -3507,8 +3520,8 @@
    // send request
    if (request_obj)
      {
      // prompt('request', this.env.comm_path+'&_action='+escape(action)+'&'+querystring);
      console('HTTP request: '+this.env.comm_path+'&_action='+escape(action)+'&'+querystring);
      // prompt('request', this.env.comm_path+'&_action='+urlencode(action)+'&'+querystring);
      console('HTTP request: '+this.env.comm_path+'&_action='+action+'&'+querystring);
      if (lock)
        this.set_busy(true);
@@ -3517,7 +3530,7 @@
      request_obj.__action = action;
      request_obj.onerror = function(o){ rcube_webmail_client.http_error(o); };
      request_obj.oncomplete = function(o){ rcube_webmail_client.http_response(o); };
      request_obj.GET(this.env.comm_path+'&_action='+escape(action)+'&'+querystring);
      request_obj.GET(this.env.comm_path+'&_action='+action+'&'+querystring);
      }
    };
@@ -3565,7 +3578,7 @@
  // handle HTTP request errors
  this.http_error = function(request_obj)
    {
    alert('Error sending request: '+request_obj.url);
    //alert('Error sending request: '+request_obj.url);
    if (request_obj.__lock)
      this.set_busy(false);
@@ -3586,6 +3599,12 @@
  // send periodic request to check for recent messages
  this.check_for_recent = function()
    {
    if (this.busy)
      {
      this.send_keep_alive();
      return;
      }
    this.set_busy(true, 'checkingmail');
    var d = new Date();
    this.http_request('check-recent', '_t='+d.getTime());
@@ -3828,14 +3847,21 @@
    else if(this.xmlhttp.readyState == 4)
      {
      if(this.xmlhttp.status == 0)
        this.onabort(this);
      else if(this.xmlhttp.status == 200)
        this.oncomplete(this);
      else
      try {
        if (this.xmlhttp.status == 0)
          this.onabort(this);
        else if(this.xmlhttp.status == 200)
          this.oncomplete(this);
        else
          this.onerror(this);
        this.busy = false;
        }
      catch(err)
        {
        this.onerror(this);
      this.busy = false;
        this.busy = false;
        }
      }
    }