From 8d9dcca2b6fc1117e170195aa4104980e5bfa238 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Wed, 30 Oct 2013 11:53:22 -0400
Subject: [PATCH] Merge branch 'master' of github.com:roundcube/roundcubemail

---
 program/js/list.js |   67 ++++++++++++++-------------------
 program/js/app.js  |   21 ++++++----
 2 files changed, 42 insertions(+), 46 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 81b796e..55dea36 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -2062,12 +2062,14 @@
 
     if (name && (frame = this.get_frame_element(name))) {
       if (!show && (win = this.get_frame_window(name))) {
-        if (win.stop)
-          win.stop();
-        else // IE
-          win.document.execCommand('Stop');
+        if (win.location.href.indexOf(this.env.blankpage) < 0) {
+          if (win.stop)
+            win.stop();
+          else // IE
+            win.document.execCommand('Stop');
 
-        win.location.href = this.env.blankpage;
+          win.location.href = this.env.blankpage;
+        }
       }
       else if (!bw.safari && !bw.konq)
         $(frame)[show ? 'show' : 'hide']();
@@ -3030,9 +3032,12 @@
   // test if purge command is allowed
   this.purge_mailbox_test = function()
   {
-    return (this.env.exists && (this.env.mailbox == this.env.trash_mailbox || this.env.mailbox == this.env.junk_mailbox
-      || this.env.mailbox.match('^' + RegExp.escape(this.env.trash_mailbox) + RegExp.escape(this.env.delimiter))
-      || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter))));
+    return (this.env.exists && (
+      this.env.mailbox == this.env.trash_mailbox
+      || this.env.mailbox == this.env.junk_mailbox
+      || this.env.mailbox.indexOf(this.env.trash_mailbox + this.env.delimiter) == 0
+      || this.env.mailbox.indexOf(this.env.junk_mailbox + this.env.delimiter) == 0
+    ));
   };
 
 
diff --git a/program/js/list.js b/program/js/list.js
index 0f63c6d..46d9d27 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -55,7 +55,6 @@
   this.column_fixed = null;
   this.last_selected = 0;
   this.shift_start = 0;
-  this.in_selection_before = false;
   this.focused = false;
   this.drag_mouse_start = null;
   this.dblclick_time = 500; // default value on MS Windows is 500
@@ -405,20 +404,15 @@
 drag_row: function(e, id)
 {
   // don't do anything (another action processed before)
-  var evtarget = rcube_event.get_target(e),
-    tagname = evtarget.tagName.toLowerCase();
-
-  if (evtarget && (tagname == 'input' || tagname == 'img' || (tagname != 'a' && evtarget.onclick)))
+  if (!this.is_event_target(e))
     return true;
 
   // accept right-clicks
   if (rcube_event.get_button(e) == 2)
     return true;
 
-  this.in_selection_before = e && e.istouch || this.in_selection(id) ? id : false;
-
   // selects currently unselected row
-  if (!this.in_selection_before) {
+  if (!(e && e.istouch || this.in_selection(id))) {
     var mod_key = rcube_event.get_modifier(e);
     this.select_row(id, mod_key, false);
   }
@@ -446,22 +440,18 @@
  */
 click_row: function(e, id)
 {
-  var now = new Date().getTime(),
-    mod_key = rcube_event.get_modifier(e),
-    evtarget = rcube_event.get_target(e),
-    tagname = evtarget.tagName.toLowerCase();
-
-  if ((evtarget && (tagname == 'input' || tagname == 'img')))
+  // don't do anything (another action processed before)
+  if (!this.is_event_target(e))
     return true;
 
-  var dblclicked = now - this.rows[id].clicked < this.dblclick_time;
+  var now = new Date().getTime(),
+    dblclicked = now - this.rows[id].clicked < this.dblclick_time;
 
-  // selects/unselects currently selected row
-  if (!this.drag_active && this.in_selection_before == id && !dblclicked)
-    this.select_row(id, mod_key, true);
+  // selects (or unselects currently selected) row
+  if (!this.drag_active && !dblclicked)
+    this.select_row(id, rcube_event.get_modifier(e), true);
 
   this.drag_start = false;
-  this.in_selection_before = false;
 
   // row was double clicked
   if (this.rowcount && dblclicked && this.in_selection(id)) {
@@ -479,6 +469,18 @@
 
   this.rows[id].clicked = now;
   return false;
+},
+
+
+/**
+ * Check target of the current event
+ */
+is_event_target: function(e)
+{
+  var target = rcube_event.get_target(e),
+    tagname = target.tagName.toLowerCase();
+
+  return !(target && (tagname == 'input' || tagname == 'img' || (tagname != 'a' && target.onclick)));
 },
 
 
@@ -856,14 +858,8 @@
 {
   var row = this.get_first_row();
   if (row) {
-    if (mod_key) {
-      this.shift_select(row, mod_key);
-      this.triggerEvent('select');
-      this.scrollto(row);
-    }
-    else {
-      this.select(row);
-    }
+    this.select_row(row, mod_key, false);
+    this.scrollto(row);
   }
 },
 
@@ -875,14 +871,8 @@
 {
   var row = this.get_last_row();
   if (row) {
-    if (mod_key) {
-      this.shift_select(row, mod_key);
-      this.triggerEvent('select');
-      this.scrollto(row);
-    }
-    else {
-      this.select(row);
-    }
+    this.select_row(row, mod_key, false);
+    this.scrollto(row);
   }
 },
 
@@ -1255,14 +1245,15 @@
       scroll_to = Number(row.offsetTop);
     }
 
-    if(this.fixed_header)
+    if (this.fixed_header)
       head_offset = Number(this.thead.offsetHeight);
-    
+
     // if row is above the frame (or behind header)
     if (scroll_to < Number(this.frame.scrollTop) + head_offset) {
       // scroll window so that row isn't behind header
       this.frame.scrollTop = scroll_to - head_offset;
-    } else if (scroll_to + Number(row.offsetHeight) > Number(this.frame.scrollTop) + Number(this.frame.offsetHeight))
+    }
+    else if (scroll_to + Number(row.offsetHeight) > Number(this.frame.scrollTop) + Number(this.frame.offsetHeight))
       this.frame.scrollTop = (scroll_to + Number(row.offsetHeight)) - Number(this.frame.offsetHeight);
   }
 },

--
Gitblit v1.9.1