From 070bc8302e00f766076b4aaabfd2de4a0f2da66f Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Wed, 20 Jul 2011 15:09:12 -0400
Subject: [PATCH] - Add check for inArray() input to prevent error in Firefox 5

---
 program/js/app.js |   90 +++++++++++++++++++++++++++++----------------
 1 files changed, 58 insertions(+), 32 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 125b645..df14fc9 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -209,7 +209,7 @@
           $(this.gui_objects.qsearchbox).focusin(function() { rcmail.message_list.blur(); });
         }
 
-        if (this.env.trash_mailbox && this.env.mailbox != this.env.trash_mailbox)
+        if (!this.env.flag_for_deletion && this.env.trash_mailbox && this.env.mailbox != this.env.trash_mailbox)
           this.set_alttext('delete', 'movemessagetotrash');
 
         this.env.message_commands = ['show', 'reply', 'reply-all', 'reply-list', 'forward',
@@ -338,6 +338,10 @@
 
         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);
         break;
 
 
@@ -526,7 +530,7 @@
 
           this.list_mailbox(props);
 
-          if (this.env.trash_mailbox)
+          if (this.env.trash_mailbox && !this.env.flag_for_deletion)
             this.set_alttext('delete', this.env.mailbox != this.env.trash_mailbox ? 'movemessagetotrash' : 'deletemessage');
         }
         else if (this.task == 'addressbook') {
@@ -2900,9 +2904,9 @@
     this.auto_save_start();
   };
 
-  this.init_address_input_events = function(obj)
+  this.init_address_input_events = function(obj, action)
   {
-    obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e){ return ref.ksearch_keydown(e, this); })
+    obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e) { return ref.ksearch_keydown(e, this, action); })
       .attr('autocomplete', 'off');
   };
 
@@ -3437,14 +3441,14 @@
   /*********************************************************/
 
   // handler for keyboard events on address-fields
-  this.ksearch_keydown = function(e, obj)
+  this.ksearch_keydown = function(e, obj, action)
   {
     if (this.ksearch_timer)
       clearTimeout(this.ksearch_timer);
 
-    var highlight;
-    var key = rcube_event.get_keycode(e);
-    var mod = rcube_event.get_modifier(e);
+    var highlight,
+      key = rcube_event.get_keycode(e),
+      mod = rcube_event.get_modifier(e);
 
     switch (key) {
       case 38:  // key up
@@ -3468,7 +3472,7 @@
           break;
 
      case 13:  // enter
-        if (this.ksearch_selected===null || !this.ksearch_input || !this.ksearch_value)
+        if (this.ksearch_selected === null || !this.ksearch_input || !this.ksearch_value)
           break;
 
         // insert selected address and hide ksearch pane
@@ -3488,7 +3492,7 @@
     }
 
     // start timer
-    this.ksearch_timer = window.setTimeout(function(){ ref.ksearch_get_results(); }, 200);
+    this.ksearch_timer = window.setTimeout(function(){ ref.ksearch_get_results(action); }, 200);
     this.ksearch_input = obj;
 
     return true;
@@ -3516,6 +3520,7 @@
     var inp_value = this.ksearch_input.value,
       cpos = this.get_caret_pos(this.ksearch_input),
       p = inp_value.lastIndexOf(this.ksearch_value, cpos),
+      trigger = false,
       insert = '',
 
       // replace search string with full address
@@ -3527,10 +3532,12 @@
       insert += this.env.contacts[id].name + ', ';
       this.group2expand = $.extend({}, this.env.contacts[id]);
       this.group2expand.input = this.ksearch_input;
-      this.http_request('group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false);
+      this.http_request('mail/group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false);
     }
-    else if (typeof this.env.contacts[id] === 'string')
+    else if (typeof this.env.contacts[id] === 'string') {
       insert = this.env.contacts[id] + ', ';
+      trigger = true;
+    }
 
     this.ksearch_input.value = pre + insert + end;
 
@@ -3538,18 +3545,22 @@
     cpos = p+insert.length;
     if (this.ksearch_input.setSelectionRange)
       this.ksearch_input.setSelectionRange(cpos, cpos);
+
+    if (trigger)
+      this.triggerEvent('autocomplete_insert', { field:this.ksearch_input, insert:insert });
   };
 
   this.replace_group_recipients = function(id, recipients)
   {
     if (this.group2expand && this.group2expand.id == id) {
       this.group2expand.input.value = this.group2expand.input.value.replace(this.group2expand.name, recipients);
+      this.triggerEvent('autocomplete_insert', { field:this.group2expand.input, insert:recipients });
       this.group2expand = null;
     }
   };
 
   // address search processor
-  this.ksearch_get_results = function()
+  this.ksearch_get_results = function(action)
   {
     var inp_value = this.ksearch_input ? this.ksearch_input.value : null;
 
@@ -3595,7 +3606,7 @@
       return;
 
     var lock = this.display_message(this.get_label('searching'), 'loading');
-    this.http_post('autocomplete', '_search='+urlencode(q), lock);
+    this.http_post(action ? action : 'mail/autocomplete', '_search='+urlencode(q), lock);
   };
 
   this.ksearch_query_results = function(results, search)
@@ -4449,6 +4460,10 @@
       row.obj.onmouseout = function() { p.unfocus_subscription(row.id); };
     };
     this.subscription_list.init();
+    $('#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)
@@ -4467,6 +4482,10 @@
           this.set_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);
@@ -4512,11 +4531,13 @@
         (this.env.dstfolder != this.env.mailbox.replace(reg, ''))
     ) {
       reg = new RegExp('[^'+delim+']*['+delim+']', 'g');
-      var lock = this.set_busy(true, 'foldermoving'),
-        basename = this.env.mailbox.replace(reg, ''),
+      var basename = this.env.mailbox.replace(reg, ''),
         newname = this.env.dstfolder==this.env.delimiter ? basename : this.env.dstfolder+this.env.delimiter+basename;
-
-      this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.mailbox)+'&_folder_newname='+urlencode(newname), lock);
+        
+      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'));
+        this.subscription_list.draglayer.hide();
+      }
     }
     this.drag_active = false;
     this.unfocus_subscription(this.get_folder_row_id(this.env.dstfolder));
@@ -4546,9 +4567,9 @@
     if (!this.gui_objects.subscriptionlist)
       return false;
 
-    var row, n, i, tmp, folders, len, list = [], slist = [],
+    var row, n, i, tmp, folders, rowid, list = [], slist = [],
       tbody = this.gui_objects.subscriptionlist.tBodies[0],
-      refrow = $('tr', tbody).get(0),
+      refrow = $('tr', tbody).get(1),
       id = 'rcmrow'+((new Date).getTime());
 
     if (!refrow) {
@@ -4575,7 +4596,10 @@
     this.env.subscriptionrows[id] = [name, display_name, 0];
 
     // sort folders, to find a place where to insert the row
-    folders = this.env.subscriptionrows;
+    folders = [];
+    $.each(this.env.subscriptionrows, function(k,v){ folders.push(v) });
+    folders.sort(function(a,b){ return a[0] < b[0] ? -1 : (a[0] > b[0] ? 1 : 0) });
+
     for (n in folders) {
       // protected folder
       if (folders[n][2]) {
@@ -4591,19 +4615,22 @@
         tmp = null;
       }
     }
-    list.sort();
-    // make sure protected folders (and their subs) are on top
-    list = slist.concat(list);
+
+    // check if subfolder of a protected folder
+    for (n=0; n<slist.length; n++) {
+      if (name.indexOf(slist[n]+this.env.delimiter) == 0)
+        rowid = this.get_folder_row_id(slist[n]);
+    }
 
     // find folder position after sorting
-    for (n=0, len=list.length; n<len; n++) {
-      if (list[n] == name)
-        break;
+    for (n=0; !rowid && n<list.length; n++) {
+      if (n && list[n] == name)
+        rowid = this.get_folder_row_id(list[n-1]);
     }
 
     // add row to the table
-    if (n && n < len)
-      $('#'+this.get_folder_row_id(list[n-1])).after(row);
+    if (rowid)
+      $('#'+rowid).after(row);
     else
       row.appendTo(tbody);
 
@@ -5685,7 +5712,7 @@
 
       if (!field.length) {
         field = $('<input>').attr({type: 'hidden', name: fname});
-        field.appendTo(form);
+        field.prependTo(form);
       }
 
       field.val(ts);
@@ -5836,11 +5863,10 @@
 
       if (elm.type == 'hidden')
         continue;
-
       // remember which elem was disabled before lock
       if (lock && elm.disabled)
         this.disabled_form_elements.push(elm);
-      else if (lock || $.inArray(elm, this.disabled_form_elements)<0)
+      else if (lock || (this.disabled_form_elements && $.inArray(elm, this.disabled_form_elements)<0))
         elm.disabled = lock;
     }
   };

--
Gitblit v1.9.1