alecpl
2008-06-11 d87fc29fee9e629fad49d956a449ae647c0bc142
program/js/app.js
@@ -630,7 +630,7 @@
          var input_email = rcube_find_object('_email');
          // user prefs
          if (input_pagesize && isNaN(input_pagesize.value))
          if (input_pagesize && isNaN(parseInt(input_pagesize.value)))
            {
            alert(this.get_label('nopagesizewarning'));
            input_pagesize.focus();
@@ -1232,9 +1232,12 @@
    var frm;
    if (this.env.contentframe && (frm = rcube_find_object(this.env.contentframe)))
      {
      if (!show && window.frames[this.env.contentframe] && frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)<0)
        frames[this.env.contentframe].location.href = this.env.blankpage;
      if (!bw.safari)
      if (!show && window.frames[this.env.contentframe])
        {
        if (window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)<0)
     window.frames[this.env.contentframe].location.href = this.env.blankpage;
   }
      else if (!bw.safari)
        frm.style.display = show ? 'block' : 'none';
      }
      
@@ -1394,13 +1397,13 @@
      lock = true;
      this.set_busy(true, 'movingmessage');
      }
    else
    else if (!this.env.flag_for_deletion)
      this.show_contentframe(false);
    // Hide message command buttons until a message is selected
    this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', false);
    this._with_selected_messages('moveto', lock, add_url);
    this._with_selected_messages('moveto', lock, add_url, (this.env.flag_for_deletion ? false : true));
    };
  // delete selected messages from the current mailbox
@@ -1450,12 +1453,12 @@
      return;
      
    this.show_contentframe(false);
    this._with_selected_messages('delete', false, '&_from='+(this.env.action ? this.env.action : ''));
    this._with_selected_messages('delete', false, '&_from='+(this.env.action ? this.env.action : ''), true);
    };
  // Send a specifc request with UIDs of all selected messages
  // @private
  this._with_selected_messages = function(action, lock, add_url)
  this._with_selected_messages = function(action, lock, add_url, remove)
    {
    var a_uids = new Array();
@@ -1464,13 +1467,28 @@
    else
      {
      var selection = this.message_list.get_selection();
      var rows = this.message_list.rows;
      var id;
      for (var n=0; n<selection.length; n++)
        {
        id = selection[n];
        a_uids[a_uids.length] = id;
        this.message_list.remove_row(id, (n == selection.length-1));
   if (remove)
          this.message_list.remove_row(id, (n == selection.length-1));
        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 (rows[id].icon && this.env.deletedicon)
            rows[id].icon.src = this.env.deletedicon;
     }
        }
      }
    
@@ -1792,7 +1810,9 @@
      }
    // check for empty body
    if ((input_message.value == '' && (!window.tinyMCE || tinyMCE.getContent() == '')) && !confirm(this.get_label('nobodywarning')))
    if ((input_message.value == '' &&
         (!window.tinyMCE || tinyMCE.get('compose-body').getContent() == '')) &&
        !confirm(this.get_label('nobodywarning')))
      {
      input_message.focus();
      return false;
@@ -1830,12 +1850,12 @@
    {
    // check input fields
    var input_to = rcube_find_object('_to');
    var input_cc = rcube_find_object('_to');
    var input_bcc = rcube_find_object('_to');
    var input_cc = rcube_find_object('_cc');
    var input_bcc = rcube_find_object('_bcc');
    var input_subject = rcube_find_object('_subject');
    var input_message = rcube_find_object('_message');
    var editor, input_message;
    var str = '';
    if (input_to && input_to.value)
      str += input_to.value+':';
    if (input_cc && input_cc.value)
@@ -1844,8 +1864,14 @@
      str += input_bcc.value+':';
    if (input_subject && input_subject.value)
      str += input_subject.value+':';
    if (input_message && input_message.value)
    if (editor = tinyMCE.get('compose-body'))
      str += editor.getContent();
    else
      {
      input_message = rcube_find_object('_message');
      str += input_message.value;
      }
    
    if (save)
      this.cmp_hash = str;
@@ -1983,7 +2009,7 @@
      // have to do it this way for IE
      // otherwise the form will be posted to a new window
      if(document.all && !window.opera)
      if(document.all)
        {
        var html = '<iframe name="'+frame_name+'" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
        document.body.insertAdjacentHTML('BeforeEnd',html);
@@ -1992,8 +2018,9 @@
        {
        var frame = document.createElement('IFRAME');
        frame.name = frame_name;
        frame.width = 10;
        frame.height = 10;
        frame.style.border = 'none';
        frame.style.width = 0;
        frame.style.height = 0;
        frame.style.visibility = 'hidden';
        document.body.appendChild(frame);
        }
@@ -2165,22 +2192,6 @@
    };
  // handler for mouse events on address-fields
  this.ksearch_onmousemove = function(li)
    {
    var last = document.getElementById('rcmksearchSelected');
    if (last)
      {
        last.removeAttribute('id');
        this.set_classname(last, 'selected', false);
      }
    li.setAttribute('id', 'rcmksearchSelected');
    this.set_classname(li, 'selected', true);
    this.ksearch_selected = li._rcm_id;
    };
  this.insert_recipient = function(id)
  {
    if (!this.env.contacts[id] || !this.ksearch_input)
@@ -2201,7 +2212,6 @@
    cpos = p+insert.length;
    if (this.ksearch_input.setSelectionRange)
      this.ksearch_input.setSelectionRange(cpos, cpos);
  };
@@ -2270,9 +2280,6 @@
        {
        li = document.createElement('LI');
        li.innerHTML = a_results[i].replace(/</, '&lt;').replace(/>/, '&gt;');
        li.onmousedown = function(e){ ref.insert_recipient(this._rcm_id); ref.ksearch_pane.show(0); return rcube_event.cancel(e); };
        li.onmouseover = function(e){ ref.ksearch_onmousemove(this); };
       li.style.cursor = 'pointer';
        li._rcm_id = a_result_ids[i];
        ul.appendChild(li);
        }
@@ -2491,7 +2498,7 @@
      qs += '&_search='+this.env.search_request;
    // send request to server
    this.http_post('delete', '_cid='+urlencode(a_cids.join(','))+'&_from='+(this.env.action ? this.env.action : '')+qs);
    this.http_post('delete', '_cid='+urlencode(a_cids.join(','))+'&_source='+urlencode(this.env.source)+'&_from='+(this.env.action ? this.env.action : '')+qs);
    return true;
    };
@@ -2589,12 +2596,13 @@
    var row, folder;
    var reg = RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
    if (this.drag_active && (row = document.getElementById(id)))
    if (this.drag_active && this.env.folder && (row = document.getElementById(id)))
      if (this.env.subscriptionrows[id] &&
          (folder = this.env.subscriptionrows[id][0]))
        {
        if (this.check_droptarget(folder) &&
            (folder != this.env.folder.replace(reg, '')) &&
           !this.env.subscriptionrows[this.get_folder_row_id(this.env.folder)][2] &&
       (folder != this.env.folder.replace(reg, '')) &&
            (!folder.match(new RegExp('^'+RegExp.escape(this.env.folder+this.env.delimiter)))))
          {
          this.set_env('dstfolder', folder);
@@ -2626,8 +2634,7 @@
    var id, folder;
    if ((id = list.get_single_selection()) &&
        this.env.subscriptionrows['rcmrow'+id] &&
        (folder = this.env.subscriptionrows['rcmrow'+id][0]) &&
        (find_in_array(this.env.defaultfolders, folder)!=0))
        (folder = this.env.subscriptionrows['rcmrow'+id][0]))
      this.set_env('folder', folder);
    else
      this.set_env('folder', null);
@@ -2661,12 +2668,20 @@
    var form;
    if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
      {
      name = form.elements['_folder_name'].value;
    if (this.env.folder && name != '')
      name = this.env.folder+this.env.delimiter+name;
    if (name)
      if (name.indexOf(this.env.delimiter)>=0)
        {
        alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')');
        return false;
        }
      if (this.env.folder && name != '')
        name = this.env.folder+this.env.delimiter+name;
      this.http_post('create-folder', '_name='+urlencode(name), true);
      }
    else if (form.elements['_folder_name'])
      form.elements['_folder_name'].focus();
    };
@@ -2679,20 +2694,20 @@
    var temp, row, form;
    // reset current renaming
  if (temp = this.edit_folder)
    {
    this.reset_folder_rename();
    if (temp == id)
      return;
    }
    if (temp = this.edit_folder)
      {
      this.reset_folder_rename();
      if (temp == id)
        return;
      }
    if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id)))
      {
      var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']');
      this.name_input = document.createElement('INPUT');
      this.name_input.value = this.env.subscriptionrows[id][1].replace(reg, '');
      this.name_input.value = this.env.subscriptionrows[id][0].replace(reg, '');
      this.name_input.style.width = '100%';
      reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
      this.name_input.__parent = this.env.subscriptionrows[id][0].replace(reg, '');
      this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
@@ -2711,11 +2726,9 @@
  this.reset_folder_rename = function()
    {
    var cell = this.name_input ? this.name_input.parentNode : null;
    if (cell && this.edit_folder && this.env.subscriptionrows[this.edit_folder])
      {
      var reg = new RegExp('[^'+RegExp.escape(this.env.delimiter)+']*['+RegExp.escape(this.env.delimiter)+']', 'g');
      cell.innerHTML = this.env.subscriptionrows[this.edit_folder][1].replace(reg, '&nbsp;&nbsp;&nbsp;&nbsp;');
      }
      cell.innerHTML = this.env.subscriptionrows[this.edit_folder][1];
      
    this.edit_folder = null;
    };
@@ -2732,8 +2745,15 @@
      var newname = this.name_input ? this.name_input.value : null;
      if (this.edit_folder && newname)
        {
        if (newname.indexOf(this.env.delimiter)>=0)
          {
          alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')');
          return false;
          }
        if (this.name_input.__parent)
          newname = this.name_input.__parent + this.env.delimiter + newname;
        this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname));
        }
      }
@@ -2758,20 +2778,19 @@
      if (this.gui_objects.createfolderhint)
        this.gui_objects.createfolderhint.innerHTML = '';
      }
    };
  // add a new folder to the subscription list by cloning a folder row
  this.add_folder_row = function(name, display_name, replace)
  this.add_folder_row = function(name, display_name, replace, before)
    {
    name = name.replace('\\',"");
    if (!this.gui_objects.subscriptionlist)
      return false;
    // find not protected folder
    for (var refid in this.env.subscriptionrows)
      if (this.env.subscriptionrows[refid]!=null)
      if (this.env.subscriptionrows[refid]!=null && !this.env.subscriptionrows[refid][2])
        break;
    var refrow, form;
@@ -2795,14 +2814,18 @@
      // clone a table row if there are existing rows
      var row = this.clone_table_row(refrow);
      row.id = id;
      if (replace)
        tbody.replaceChild(row, replace);
      if (before && (before = this.get_folder_row_id(before)))
   tbody.insertBefore(row, document.getElementById(before));
      else
        tbody.appendChild(row);
        tbody.appendChild(row);
      if (replace)
   tbody.removeChild(replace);
      }
    // add to folder/row-ID map
    this.env.subscriptionrows[row.id] = [name, display_name];
    this.env.subscriptionrows[row.id] = [name, display_name, 0];
    // set folder name
    row.cells[0].innerHTML = display_name;
@@ -2826,7 +2849,6 @@
        form.elements['_folder_name'].value = ''; 
      }
    this.sort_subscription_list();
    this.init_subscription_list();
    if (selection && document.getElementById('rcmrow'+selection))
      this.subscription_list.select_row(selection);
@@ -2837,13 +2859,13 @@
  // replace an existing table row with a new folder line
  this.replace_folder_row = function(oldfolder, newfolder, display_name)
  this.replace_folder_row = function(oldfolder, newfolder, display_name, before)
    {
    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, display_name, row);
    this.add_folder_row(newfolder, display_name, row, before);
    
    // rename folder in rename-folder dropdown
    var form, elm;
@@ -2862,7 +2884,7 @@
      form.elements['_folder_newname'].value = '';
      }
    };
  // remove the table row of a specific mailbox from the table
  // (the row will not be removed, just hidden)
@@ -2871,7 +2893,7 @@
    var row;
    var id = this.get_folder_row_id(folder);
    if (id && (row = document.getElementById(id)))
      row.style.display = 'none';
      row.style.display = 'none';
    // remove folder from rename-folder list
    var form;
@@ -2938,32 +2960,6 @@
    return new_row;
    };
  // sort subscription folder list
  this.sort_subscription_list = function()
    {
    var index = new Array();
    var tbody = this.gui_objects.subscriptionlist.tBodies[0];
    var swapped = false;
    for (var i = 0; i<tbody.childNodes.length; i++)
      if (this.env.subscriptionrows[tbody.childNodes[i].id]!=null)
        index.push(i);
    for (i = 0; i<(index.length-1); i++)
      {
      var one = tbody.childNodes[index[i]];
      var two = tbody.childNodes[index[i+1]];
      if (this.env.subscriptionrows[one.id][0].toLowerCase()>
          this.env.subscriptionrows[two.id][0].toLowerCase())
        {
        var swap = one.cloneNode(true);
        tbody.replaceChild(swap, two);
        tbody.replaceChild(two, one);
        swapped = true;
        }
      }
    if (swapped)
      this.sort_subscription_list();
    };
  /*********************************************************/
  /*********           GUI functionality           *********/
@@ -2987,7 +2983,7 @@
    var button, obj;
    if(!a_buttons || !a_buttons.length)
      return;
      return false;
    for(var n=0; n<a_buttons.length; n++)
      {
@@ -3055,7 +3051,7 @@
    var button, img;
    if(!a_buttons || !a_buttons.length)
      return;
      return false;
    for(var n=0; n<a_buttons.length; n++)
      {
@@ -3067,6 +3063,7 @@
          img.src = button.over;
        }
      }
    };
  // mouse down on button