alecpl
2010-11-30 489ffbde732bb0560e4b553bc97aa8b831b97d8f
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; };
@@ -200,12 +214,16 @@
{
  var id;
  this.focused = true;
  for (var n in this.selection) {
    id = this.selection[n];
    if (this.rows[id] && this.rows[id].obj) {
      $(this.rows[id].obj).addClass('selected').removeClass('unfocused');
    }
  }
  // Un-focus already focused elements
  $('*:focus', window).blur();
  if (e || (e = window.event))
    rcube_event.cancel(e);
@@ -285,6 +303,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 +333,7 @@
  if (this.dont_select) {
    this.dont_select = false;
    return false;
    }
  }
  var dblclicked = now - this.rows[id].clicked < this.dblclick_time;
@@ -844,7 +866,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 +1094,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 +1122,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 +1143,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 +1153,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 +1169,7 @@
      }
    }
    this.draglayer.html(names);
    this.draglayer.show();
    this.drag_active = true;
    this.triggerEvent('dragstart');
  }
@@ -1159,6 +1192,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 +1211,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 +1400,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');
}