From ef17c54e739676a73fff69fa85ea39a3a516fcab Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Fri, 12 Nov 2010 13:50:24 -0500
Subject: [PATCH] - Fix IE issue when replacing spaces doesn't work - Some code improvements

---
 program/js/list.js |   89 +++++++++++++++++++++++++++++++++-----------
 1 files changed, 66 insertions(+), 23 deletions(-)

diff --git a/program/js/list.js b/program/js/list.js
index c94453c..aabba08 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -1,9 +1,9 @@
 /*
  +-----------------------------------------------------------------------+
- | RoundCube List Widget                                                 |
+ | Roundcube List Widget                                                 |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2009, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2009, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -18,7 +18,7 @@
 
 
 /**
- * RoundCube List Widget class
+ * Roundcube List Widget class
  * @contructor
  */
 function rcube_list_widget(list, p)
@@ -102,14 +102,28 @@
 {
   // make references in internal array and set event handlers
   if (row && String(row.id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)) {
-    var p = this;
+    var self = this;
     var uid = RegExp.$1;
     row.uid = uid;
     this.rows[uid] = {uid:uid, id:row.id, obj:row};
 
     // set eventhandlers to table row
-    row.onmousedown = function(e){ return p.drag_row(e, this.uid); };
-    row.onmouseup = function(e){ return p.click_row(e, this.uid); };
+    row.onmousedown = function(e){ return self.drag_row(e, this.uid); };
+    row.onmouseup = function(e){ return self.click_row(e, this.uid); };
+    
+    if (bw.iphone || bw.ipad) {
+      row.addEventListener('touchstart', function(e) {
+        if (e.touches.length == 1) {
+          if (!self.drag_row(rcube_event.touchevent(e.touches[0]), this.uid))
+            e.preventDefault();
+        }
+      }, false);
+      row.addEventListener('touchend', function(e) {
+        if (e.changedTouches.length == 1)
+          if (!self.click_row(rcube_event.touchevent(e.changedTouches[0]), this.uid))
+            e.preventDefault();
+      }, false);
+    }
 
     if (document.all)
       row.onselectstart = function() { return false; };
@@ -285,6 +299,10 @@
     this.drag_mouse_start = rcube_event.get_mouse_pos(e);
     rcube_event.add_listener({event:'mousemove', object:this, method:'drag_mouse_move'});
     rcube_event.add_listener({event:'mouseup', object:this, method:'drag_mouse_up'});
+    if (bw.iphone || bw.ipad) {
+      rcube_event.add_listener({event:'touchmove', object:this, method:'drag_mouse_move'});
+      rcube_event.add_listener({event:'touchend', object:this, method:'drag_mouse_up'});
+    }
 
     // enable dragging over iframes
     this.add_dragfix();
@@ -311,7 +329,7 @@
   if (this.dont_select) {
     this.dont_select = false;
     return false;
-    }
+  }
 
   var dblclicked = now - this.rows[id].clicked < this.dblclick_time;
 
@@ -393,7 +411,7 @@
       var r = this.rows[new_row.uid];
       if (r && r.depth <= depth)
         break;
-      $(new_row).hide();
+      $(new_row).css('display', 'none');
       if (r.expanded) {
         r.expanded = false;
         this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded });
@@ -436,7 +454,7 @@
           if (p && p.expanded) {
             if ((row && p == row) || last_expanded_parent_depth >= p.depth - 1) {
               last_expanded_parent_depth = p.depth;
-              $(new_row).show();
+              $(new_row).css('display', '');
               r.expanded = true;
               this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded });
             }
@@ -481,7 +499,7 @@
           break;
 
         if (row || r.depth)
-          $(new_row).hide();
+          $(new_row).css('display', 'none');
         if (r.has_children && r.expanded) {
           r.expanded = false;
           this.update_expando(r.uid, false);
@@ -517,7 +535,7 @@
         if (row && r.depth <= depth)
           break;
 
-        $(new_row).show();
+        $(new_row).css('display', '');
         if (r.has_children && !r.expanded) {
           r.expanded = true;
           this.update_expando(r.uid, true);
@@ -844,7 +862,7 @@
 
   // one row
   if (id) {
-    for (var n=0 in this.selection)
+    for (var n in this.selection)
       if (this.selection[n] == id) {
         this.selection.splice(n,1);
         break;
@@ -1072,6 +1090,14 @@
  */
 drag_mouse_move: function(e)
 {
+  // convert touch event
+  if (e.type == 'touchmove') {
+    if (e.changedTouches.length == 1)
+      e = rcube_event.touchevent(e.changedTouches[0]);
+    else
+      return rcube_event.cancel(e);
+  }
+  
   if (this.drag_start) {
     // check mouse movement, of less than 3 pixels, don't start dragging
     var m = rcube_event.get_mouse_pos(e);
@@ -1092,13 +1118,15 @@
         this.select_childs(uid);
     }
 
+    // reset content
+    this.draglayer.html('');
+
     // get subjects of selected messages
-    var names = '';
-    var c, i, subject, obj;
-    for (var n=0; n<this.selection.length; n++) {
+    var c, i, n, subject, obj;
+    for (n=0; n<this.selection.length; n++) {
       // only show 12 lines
       if (n>12) {
-        names += '...';
+        this.draglayer.append('...');
         break;
       }
 
@@ -1111,7 +1139,7 @@
 	          this.drag_start_pos = $(obj.childNodes[i]).offset();
 
 	        if (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == c)) {
-	          var node, tmp_node, nodes = obj.childNodes[i].childNodes;
+	          var entry, node, tmp_node, nodes = obj.childNodes[i].childNodes;
 	          // find text node
 	          for (m=0; m<nodes.length; m++) {
 	            if ((tmp_node = obj.childNodes[i].childNodes[m]) && (tmp_node.nodeType==3 || tmp_node.nodeName=='A'))
@@ -1121,11 +1149,14 @@
 	          if (!node)
 	            break;
 
-              subject = node.nodeType==3 ? node.data : node.innerHTML;
+              subject = $(node).text();
 	          // remove leading spaces
-	          subject = subject.replace(/^\s+/i, '');
+              subject = $.trim(subject);
               // truncate line to 50 characters
-	          names += (subject.length > 50 ? subject.substring(0, 50)+'...' : subject) + '<br />';
+              subject = (subject.length > 50 ? subject.substring(0, 50) + '...' : subject);
+
+              entry = $('<div>').text(subject);
+	          this.draglayer.append(entry);
               break;
             }
             c++;
@@ -1134,9 +1165,7 @@
       }
     }
 
-    this.draglayer.html(names);
     this.draglayer.show();
-
     this.drag_active = true;
     this.triggerEvent('dragstart');
   }
@@ -1159,6 +1188,11 @@
 drag_mouse_up: function(e)
 {
   document.onmousemove = null;
+  
+  if (e.type == 'touchend') {
+    if (e.changedTouches.length != 1)
+      return rcube_event.cancel(e);
+  }
 
   if (this.draglayer && this.draglayer.is(':visible')) {
     if (this.drag_start_pos)
@@ -1173,6 +1207,11 @@
 
   rcube_event.remove_listener({event:'mousemove', object:this, method:'drag_mouse_move'});
   rcube_event.remove_listener({event:'mouseup', object:this, method:'drag_mouse_up'});
+  
+  if (bw.iphone || bw.ipad) {
+    rcube_event.remove_listener({event:'touchmove', object:this, method:'drag_mouse_move'});
+    rcube_event.remove_listener({event:'touchend', object:this, method:'drag_mouse_up'});
+  }
 
   // remove temp divs
   this.del_dragfix();
@@ -1357,6 +1396,10 @@
   // update subject column position
   if (this.subject_col == from)
     this.subject_col = to > from ? to - 1 : to;
+  else if (this.subject_col < from && to <= this.subject_col)
+    this.subject_col++;
+  else if (this.subject_col > from && to >= this.subject_col)
+    this.subject_col--;
 
   this.triggerEvent('column_replace');
 }

--
Gitblit v1.9.1