From b6cd452bd31bfd4b6b94b23fe54b424fdf901e61 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 18 Aug 2011 14:34:56 -0400
Subject: [PATCH] Backport changes from r5084 to r5090 to release branch

---
 program/js/app.js |  166 ++++++++++++++++++++++++++++++------------------------
 1 files changed, 92 insertions(+), 74 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index aa4fca3..d15950d 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -309,11 +309,8 @@
           this.enable_command('show', 'edit', true);
           // register handlers for group assignment via checkboxes
           if (this.gui_objects.editform) {
-            $('input.groupmember').change(function(){
-              var cmd = this.checked ? 'group-addmembers' : 'group-delmembers';
-              ref.http_post(cmd, '_cid='+urlencode(ref.env.cid)
-                + '&_source='+urlencode(ref.env.source)
-                + '&_gid='+urlencode(this.value));
+            $('input.groupmember').change(function() {
+              ref.group_member_change(this.checked ? 'add' : 'del', ref.env.cid, ref.env.source, this.value);
             });
           }
         }
@@ -333,7 +330,7 @@
 
         this.enable_command('add', 'import', this.env.writable_source);
         this.enable_command('list', 'listgroup', 'advanced-search', true);
-        
+
         // load contacts of selected source
         if (!this.env.action)
           this.command('list', this.env.source);
@@ -644,11 +641,6 @@
             // reload form
             if (props == 'reload') {
               form.action += '?_reload=1';
-            }
-            else if ((input = $("input[name='_name']", form)) &&input.length && input.val() == '') {
-              alert(this.get_label('nonamewarning'));
-              input.focus();
-              break;
             }
             else if (this.task == 'settings' && (this.env.identities_level % 2) == 0  &&
               (input = $("input[name='_email']", form)) && input.length && !rcube_check_email(input.val())
@@ -995,14 +987,14 @@
 
       // reset quicksearch
       case 'reset-search':
-        var s = this.env.search_request;
+        var n, s = this.env.search_request || this.env.qsearch;
         this.reset_qsearch();
 
         if (s && this.env.mailbox)
           this.list_mailbox(this.env.mailbox);
         else if (s && this.task == 'addressbook') {
           if (this.env.source == '') {
-            for (var n in this.env.address_sources) break;
+            for (n in this.env.address_sources) break;
             this.env.source = n;
             this.env.group = '';
           }
@@ -1381,12 +1373,12 @@
       ul.show();
       div.removeClass('collapsed').addClass('expanded');
       var reg = new RegExp('&'+urlencode(id)+'&');
-      this.set_env('collapsed_folders', this.env.collapsed_folders.replace(reg, ''));
+      this.env.collapsed_folders = this.env.collapsed_folders.replace(reg, '');
     }
     else {
       ul.hide();
       div.removeClass('expanded').addClass('collapsed');
-      this.set_env('collapsed_folders', this.env.collapsed_folders+'&'+urlencode(id)+'&');
+      this.env.collapsed_folders = this.env.collapsed_folders+'&'+urlencode(id)+'&';
 
       // select parent folder if one of its childs is currently selected
       if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0)
@@ -1571,10 +1563,10 @@
       }
 
     if ((found = $.inArray('flag', this.env.coltypes)) >= 0)
-      this.set_env('flagged_col', found);
+      this.env.flagged_col = found;
 
     if ((found = $.inArray('subject', this.env.coltypes)) >= 0)
-      this.set_env('subject_col', found);
+      this.env.subject_col = found;
 
     this.command('save-pref', { name: 'list_cols', value: this.env.coltypes, session: 'list_attrib/columns' });
   };
@@ -1880,8 +1872,7 @@
     if (action == 'preview' && String(target.location.href).indexOf(url) >= 0)
       this.show_contentframe(true);
     else {
-      this.lock_frame();
-      this.location_href(this.env.comm_path+url, target);
+      this.location_href(this.env.comm_path+url, target, true);
 
       // mark as read and change mbox unread counter
       if (action == 'preview' && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread && this.env.preview_pane_mark_read >= 0) {
@@ -3262,11 +3253,21 @@
       return false;
 
     // get file input field, count files on capable browser
-    var field = $('input[type=file]', form).get(0),
+    var i, size = 0, field = $('input[type=file]', form).get(0),
       files = field.files ? field.files.length : field.value ? 1 : 0;
 
     // create hidden iframe and post upload form
     if (files) {
+      // check file size
+      if (field.files && this.env.max_filesize && this.env.filesizeerror) {
+        for (i=0; i<files; i++)
+          size += field.files[i].size;
+        if (size && size > this.env.max_filesize) {
+          this.display_message(this.env.filesizeerror, 'error');
+          return;
+        }
+      }
+
       var frame_name = this.async_upload_form(form, 'upload', function(e) {
         var d, content = '';
         try {
@@ -3398,7 +3399,7 @@
   this.qsearch = function(value)
   {
     if (value != '') {
-      var n, addurl = '', mods_arr = [],
+      var n, r, addurl = '', mods_arr = [],
         mods = this.env.search_mods,
         mbox = this.env.mailbox,
         lock = this.set_busy(true, 'searching');
@@ -3422,13 +3423,14 @@
 
       // reset vars
       this.env.current_page = 1;
-      this.http_request('search', '_q='+urlencode(value)
+      r = this.http_request('search', '_q='+urlencode(value)
         + (mbox ? '&_mbox='+urlencode(mbox) : '')
         + (this.env.source ? '&_source='+urlencode(this.env.source) : '')
         + (this.env.group ? '&_gid='+urlencode(this.env.group) : '')
         + (addurl ? addurl : ''), lock);
+
+      this.env.qsearch = {lock: lock, request: r};
     }
-    return true;
   };
 
   // reset quick-search form
@@ -3437,8 +3439,11 @@
     if (this.gui_objects.qsearchbox)
       this.gui_objects.qsearchbox.value = '';
 
+    if (this.env.qsearch)
+      this.abort_request(this.env.qsearch);
+
+    this.env.qsearch = null;
     this.env.search_request = null;
-    return true;
   };
 
   this.sent_successfully = function(type, msg)
@@ -3611,6 +3616,8 @@
     var old_value = this.ksearch_value;
     this.ksearch_value = q;
 
+    this.ksearch_destroy();
+
     // ...string is empty
     if (!q.length)
       return;
@@ -3618,8 +3625,6 @@
     // ...new search value contains old one and previous search result was empty
     if (old_value && old_value.length && this.env.contacts && !this.env.contacts.length && q.indexOf(old_value) == 0)
       return;
-
-    this.ksearch_destroy();
 
     var i, lock, source, xhr, reqid = new Date().getTime(),
       threads = props && props.threads ? props.threads : 1,
@@ -3644,8 +3649,12 @@
 
   this.ksearch_query_results = function(results, search, reqid)
   {
+    // search stopped in meantime?
+    if (!this.ksearch_value)
+      return;
+
     // ignore this outdated search response
-    if (this.ksearch_input && this.ksearch_value && search != this.ksearch_value)
+    if (this.ksearch_input && search != this.ksearch_value)
       return;
 
     // display search results
@@ -3685,7 +3694,7 @@
         li.innerHTML = text.replace(new RegExp('('+RegExp.escape(s_val)+')', 'ig'), '##$1%%').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/##([^%]+)%%/g, '<b>$1</b>');
         li.onmouseover = function(){ ref.ksearch_select(this); };
         li.onmouseup = function(){ ref.ksearch_click(this) };
-        li._rcm_id = i;
+        li._rcm_id = this.env.contacts.length + i;
         ul.appendChild(li);
         maxlen -= 1;
       }
@@ -3754,10 +3763,8 @@
     if (!ac)
       return;
 
-    for (i=0, len=ac.locks.length; i<len; i++) {
-      this.hide_message(ac.locks[i]); // hide loading message
-      ac.requests[i].abort(); // abort ajax request
-    }
+    for (i=0, len=ac.locks.length; i<len; i++)
+      this.abort_request({request: ac.requests[i], lock: ac.locks[i]});
 
     this.ksearch_data = null;
   }
@@ -3910,12 +3917,22 @@
       if (this.env.group)
         add_url += '&_gid='+urlencode(this.env.group);
 
-      this.lock_frame();
       this.location_href(this.env.comm_path+'&_action='+action
         +'&_source='+urlencode(this.env.source)
-        +'&_cid='+urlencode(cid) + add_url, target);
+        +'&_cid='+urlencode(cid) + add_url, target, true);
     }
     return true;
+  };
+
+  // add/delete member to/from the group
+  this.group_member_change = function(what, cid, source, gid)
+  {
+    what = what == 'add' ? 'add' : 'del';
+    var lock = this.display_message(this.get_label(what == 'add' ? 'addingmember' : 'removingmember'), 'loading');
+
+    this.http_post('group-'+what+'members', '_cid='+urlencode(cid)
+      + '&_source='+urlencode(source)
+      + '&_gid='+urlencode(gid), lock);
   };
 
   // copy a contact to the specified target (group or directory)
@@ -3924,23 +3941,22 @@
     if (!cid)
       cid = this.contact_list.get_selection().join(',');
 
-    if (to.type == 'group' && to.source == this.env.source) {
-      this.http_post('group-addmembers', '_cid='+urlencode(cid)
-        + '&_source='+urlencode(this.env.source)
-        + '&_gid='+urlencode(to.id));
-    }
+    if (to.type == 'group' && to.source == this.env.source)
+      this.group_member_change('add', cid, to.source, to.id);
     else if (to.type == 'group' && !this.env.address_sources[to.source].readonly) {
+      var lock = this.display_message(this.get_label('copyingcontact'), 'loading');
       this.http_post('copy', '_cid='+urlencode(cid)
         + '&_source='+urlencode(this.env.source)
         + '&_to='+urlencode(to.source)
         + '&_togid='+urlencode(to.id)
-        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''));
+        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''), lock);
     }
     else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly) {
+      var lock = this.display_message(this.get_label('copyingcontact'), 'loading');
       this.http_post('copy', '_cid='+urlencode(cid)
         + '&_source='+urlencode(this.env.source)
         + '&_to='+urlencode(to.id)
-        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''));
+        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''), lock);
     }
   };
 
@@ -4095,8 +4111,10 @@
 
   this.group_delete = function()
   {
-    if (this.env.group)
-      this.http_post('group-delete', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(this.env.group), true);
+    if (this.env.group && confirm(this.get_label('deletegroupconfirm'))) {
+      var lock = this.set_busy(true, 'groupdeleting');
+      this.http_post('group-delete', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(this.env.group), lock);
+    }
   };
 
   // callback from server upon group-delete command
@@ -4414,7 +4432,7 @@
   this.set_photo_actions = function(id)
   {
     var n, buttons = this.buttons['upload-photo'];
-    for (n=0; n < buttons.length; n++)
+    for (n=0; buttons && n < buttons.length; n++)
       $('#'+buttons[n].id).html(this.get_label(id == '-del-' ? 'addphoto' : 'replacephoto'));
 
     $('#ff_photo').val(id);
@@ -4433,8 +4451,7 @@
       this.contact_list.clear_selection();
     }
 
-    this.lock_frame();
-    this.location_href(this.env.comm_path+'&_action=search'+add_url, target);
+    this.location_href(this.env.comm_path+'&_action=search'+add_url, target, true);
 
     return true;
   };
@@ -4457,18 +4474,14 @@
   // preferences section select and load options frame
   this.section_select = function(list)
   {
-    var id = list.get_single_selection();
+    var id = list.get_single_selection(), add_url = '', target = window;
 
     if (id) {
-      var add_url = '', target = window;
-      this.set_busy(true);
-
       if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
         add_url = '&_framed=1';
         target = window.frames[this.env.contentframe];
       }
-      this.lock_frame();
-      this.location_href(this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url, target);
+      this.location_href(this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url, target, true);
     }
 
     return true;
@@ -4540,7 +4553,6 @@
     $('#mailboxroot')
       .mouseover(function(){ p.focus_subscription(this.id); })
       .mouseout(function(){ p.unfocus_subscription(this.id); })
-      .mouseup(function(){ if (p.drag_active) p.subscription_move_folder(); });
   };
 
   this.focus_subscription = function(id)
@@ -4551,22 +4563,16 @@
 
     if (this.drag_active && this.env.mailbox && (row = document.getElementById(id)))
       if (this.env.subscriptionrows[id] &&
-          (folder = this.env.subscriptionrows[id][0])) {
+          (folder = this.env.subscriptionrows[id][0]) !== null
+      ) {
         if (this.check_droptarget(folder) &&
             !this.env.subscriptionrows[this.get_folder_row_id(this.env.mailbox)][2] &&
             (folder != this.env.mailbox.replace(reg, '')) &&
-            (!folder.match(new RegExp('^'+RegExp.escape(this.env.mailbox+this.env.delimiter))))) {
-          this.set_env('dstfolder', folder);
+            (!folder.match(new RegExp('^'+RegExp.escape(this.env.mailbox+this.env.delimiter))))
+        ) {
+          this.env.dstfolder = folder;
           $(row).addClass('droptarget');
         }
-      }
-      else if (id == 'mailboxroot') {
-        this.set_env('dstfolder', '');
-        $(row).addClass('droptarget');
-      }
-      else if (this.env.mailbox.match(new RegExp(delim))) {
-        this.set_env('dstfolder', this.env.delimiter);
-        $(this.subscription_list.frame).addClass('droptarget');
       }
   };
 
@@ -4574,7 +4580,7 @@
   {
     var row = $('#'+id);
 
-    this.set_env('dstfolder', null);
+    this.env.dstfolder = null;
     if (this.env.subscriptionrows[id] && row[0])
       row.removeClass('droptarget');
     else
@@ -4588,7 +4594,7 @@
     if (list && (id = list.get_single_selection()) &&
         (folder = this.env.subscriptionrows['rcmrow'+id])
     ) {
-      this.set_env('mailbox', folder[0]);
+      this.env.mailbox = folder[0];
       this.show_folder(folder[0]);
       this.enable_command('delete-folder', !folder[2]);
     }
@@ -4604,12 +4610,12 @@
     var delim = RegExp.escape(this.env.delimiter),
       reg = RegExp('['+delim+']?[^'+delim+']+$');
 
-    if (this.env.mailbox && this.env.dstfolder && (this.env.dstfolder != this.env.mailbox) &&
+    if (this.env.mailbox && this.env.dstfolder !== null && (this.env.dstfolder != this.env.mailbox) &&
         (this.env.dstfolder != this.env.mailbox.replace(reg, ''))
     ) {
       reg = new RegExp('[^'+delim+']*['+delim+']', 'g');
       var basename = this.env.mailbox.replace(reg, ''),
-        newname = this.env.dstfolder==this.env.delimiter ? basename : this.env.dstfolder+this.env.delimiter+basename;
+        newname = this.env.dstfolder === '' ? basename : this.env.dstfolder+this.env.delimiter+basename;
 
       if (newname != this.env.mailbox) {
         this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.mailbox)+'&_folder_newname='+urlencode(newname), this.set_busy(true, 'foldermoving'));
@@ -4869,8 +4875,7 @@
       this.show_contentframe(true);
     }
     else {
-      this.lock_frame();
-      this.location_href(this.env.comm_path+url, target);
+      this.location_href(this.env.comm_path+url, target, true);
     }
   };
 
@@ -5283,14 +5288,14 @@
     this.env.status_col = null;
 
     if ((n = $.inArray('subject', this.env.coltypes)) >= 0) {
-      this.set_env('subject_col', n);
+      this.env.subject_col = n;
       if (list)
         list.subject_col = n;
     }
     if ((n = $.inArray('flag', this.env.coltypes)) >= 0)
-      this.set_env('flagged_col', n);
+      this.env.flagged_col = n;
     if ((n = $.inArray('status', this.env.coltypes)) >= 0)
-      this.set_env('status_col', n);
+      this.env.status_col = n;
 
     if (list)
       list.init_header();
@@ -5581,8 +5586,11 @@
     this.redirect(this.url(action, query));
   };
 
-  this.location_href = function(url, target)
+  this.location_href = function(url, target, frame)
   {
+    if (frame)
+      this.lock_frame();
+
     // simulate real link click to force IE to send referer header
     if (bw.ie && target == window)
       $('<a>').attr('href', url).appendTo(document.body).get(0).click();
@@ -5648,6 +5656,15 @@
       success: function(data){ ref.http_response(data); },
       error: function(o, status, err) { rcmail.http_error(o, status, err, lock); }
     });
+  };
+
+  // aborts ajax request
+  this.abort_request = function(r)
+  {
+    if (r.request)
+      r.request.abort();
+    if (r.lock)
+      this.set_busy(false, null, r.lock);
   };
 
   // handle HTTP response
@@ -5736,6 +5753,7 @@
       case 'check-recent':
       case 'getunread':
       case 'search':
+        this.env.qsearch = null;
       case 'list':
         if (this.task == 'mail') {
           this.enable_command('show', 'expunge', 'select-all', 'select-none', 'sort', (this.env.messagecount > 0));

--
Gitblit v1.9.1