thomascube
2009-07-21 5499336feff22f682448dd99cc00a9b36701fcd1
program/js/app.js
@@ -55,7 +55,7 @@
  // set jQuery ajax options
  jQuery.ajaxSetup({ cache:false,
    error:function(request, status, err){ ref.http_error(request, status, err); },
    beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid')); }
    beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Request', ref.env.request_token); }
  });
  // set environment variable(s)
@@ -189,7 +189,7 @@
        if (this.env.action=='show' || this.env.action=='preview')
          {
          this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete',
       'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true);
            'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true);
          if (this.env.next_uid)
            {
@@ -202,7 +202,7 @@
            this.enable_command('firstmessage', true);
            }
        
     if (this.env.blockedobjects)
          if (this.env.blockedobjects)
            {
            if (this.gui_objects.remoteobjectsmsg)
              this.gui_objects.remoteobjectsmsg.style.display = 'block';
@@ -277,6 +277,7 @@
        if (this.gui_objects.contactslist)
          {
          this.contact_list = new rcube_list_widget(this.gui_objects.contactslist, {multiselect:true, draggable:true, keyboard:true});
          this.contact_list.row_init = function(row){ p.triggerEvent('insertrow', { cid:row.uid, row:row }); };
          this.contact_list.addEventListener('keypress', function(o){ p.contactlist_keypress(o); });
          this.contact_list.addEventListener('select', function(o){ p.contactlist_select(o); });
          this.contact_list.addEventListener('dragstart', function(o){ p.drag_start(o); });
@@ -367,9 +368,6 @@
        break;
      }
    // enable basic commands
    this.enable_command('logout', true);
    // flag object as complete
    this.loaded = true;
@@ -420,7 +418,7 @@
      }
    // set eventhandler to message icon
    if (row.icon = row.obj.getElementsByTagName('TD')[0].getElementsByTagName('IMG')[0])
    if (row.icon = row.obj.getElementsByTagName('td')[0].getElementsByTagName('img')[0])
      {
      var p = this;
      row.icon.id = 'msgicn_'+row.uid;
@@ -437,13 +435,15 @@
      }
    // set eventhandler to flag icon, if icon found
    if (this.env.flagged_col && (row.flagged_icon = row.obj.getElementsByTagName('TD')[this.env.flagged_col].getElementsByTagName('IMG')[0]))
    if (this.env.flagged_col && (row.flagged_icon = row.obj.getElementsByTagName('td')[this.env.flagged_col].getElementsByTagName('img')[0]))
      {
      var p = this;
      row.flagged_icon.id = 'flaggedicn_'+row.uid;
      row.flagged_icon._row = row.obj;
      row.flagged_icon.onmousedown = function(e) { p.command('toggle_flag', this); };
      }
    this.triggerEvent('insertrow', { uid:uid, row:row });
  };
  // init message compose form: set focus and eventhandlers
@@ -551,14 +551,11 @@
          this.gui_objects.loginform.submit();
        break;
      case 'logout':
        this.goto_url('logout', '', true);
        break;
      // commands to switch task
      case 'mail':
      case 'addressbook':
      case 'settings':
      case 'logout':
        this.switch_task(command);
        break;
@@ -1266,12 +1263,12 @@
      this.env.folder_coords = new Array();
      for (var k in model) {
        if (li = this.get_folder_li(k)) {
     // only visible folders
          // only visible folders
          if (height = li.firstChild.offsetHeight) {
           pos = $(li.firstChild).offset();
           this.env.folder_coords[k] = { x1:pos.left, y1:pos.top,
      x2:pos.left + li.firstChild.offsetWidth, y2:pos.top + height, on:0 };
     }
            pos = $(li.firstChild).offset();
            this.env.folder_coords[k] = { x1:pos.left, y1:pos.top,
              x2:pos.left + li.firstChild.offsetWidth, y2:pos.top + height, on:0 };
          }
        }
      }
    }
@@ -1281,6 +1278,12 @@
  {
    this.drag_active = false;
    this.env.last_folder_target = null;
    if (this.folder_auto_timer) {
      window.clearTimeout(this.folder_auto_timer);
      this.folder_auto_timer = null;
      this.folder_auto_expand = null;
    }
    // over the folders
    if (this.gui_objects.folderlist && this.env.folder_coords) {
@@ -1299,18 +1302,18 @@
      var moffset = this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop;
      var toffset = -moffset-boffset;
      var li, pos, mouse;
      var li, div, pos, mouse;
      mouse = rcube_event.get_mouse_pos(e);
      pos = this.env.folderlist_coords;
      mouse.y += toffset;
      // if mouse pointer is outside of folderlist
      if (mouse.x < pos.x1 || mouse.x >= pos.x2 || mouse.y < pos.y1 || mouse.y >= pos.y2) {
   if (this.env.last_folder_target) {
        if (this.env.last_folder_target) {
          $(this.get_folder_li(this.env.last_folder_target)).removeClass('droptarget');
     this.env.folder_coords[this.env.last_folder_target].on = 0;
     this.env.last_folder_target = null;
   }
          this.env.folder_coords[this.env.last_folder_target].on = 0;
          this.env.last_folder_target = null;
        }
        return;
      }
    
@@ -1318,15 +1321,35 @@
      for (var k in this.env.folder_coords) {
        pos = this.env.folder_coords[k];
        if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2
       && this.check_droptarget(k)) {
          $(this.get_folder_li(k)).addClass('droptarget');
            && this.check_droptarget(k)) {
          li = this.get_folder_li(k);
          div = $(li.getElementsByTagName("div")[0]);
          // if the folder is collapsed, expand it after 1sec and restart the drag & drop process.
          if (div.hasClass('collapsed')) {
            if (this.folder_auto_timer)
              window.clearTimeout(this.folder_auto_timer);
            this.folder_auto_expand = k;
            this.folder_auto_timer = window.setTimeout(function() {
                rcmail.command("collapse-folder", rcmail.folder_auto_expand);
                rcmail.drag_start(null);
              }, 1000);
          } else if (this.folder_auto_timer) {
            window.clearTimeout(this.folder_auto_timer);
            this.folder_auto_timer = null;
            this.folder_auto_expand = null;
          }
          $(li).addClass('droptarget');
          this.env.last_folder_target = k;
     this.env.folder_coords[k].on = 1;
   }
          this.env.folder_coords[k].on = 1;
        }
        else if (pos.on) {
     $(this.get_folder_li(k)).removeClass('droptarget');
     this.env.folder_coords[k].on = 0;
   }
          $(this.get_folder_li(k)).removeClass('droptarget');
          this.env.folder_coords[k].on = 0;
        }
      }
    }
  };
@@ -2147,6 +2170,10 @@
    // Apply spellcheck changes if spell checker is active
    this.stop_spellchecking();
    // move body from html editor to textarea (just to be sure, #1485860)
    if (window.tinyMCE && tinyMCE.get('compose-body'))
      tinyMCE.triggerSave();
    return true;
    };
@@ -2378,7 +2405,7 @@
        }
      else  // for standards-compilant browsers
        {
        var frame = document.createElement('IFRAME');
        var frame = document.createElement('iframe');
        frame.name = frame_name;
        frame.style.border = 'none';
        frame.style.width = 0;
@@ -2603,13 +2630,19 @@
    // trim query string
    q = q.replace(/(^\s+|\s+$)/g, '').toLowerCase();
    // Don't (re-)search if string is empty or if the last results are still active
    // Don't (re-)search if the last results are still active
    if (q == this.ksearch_value)
      return;
    
    var old_value = this.ksearch_value;
    this.ksearch_value = q;
    
    // ...string is empty
    if (!q.length)
      return;
    // ...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.display_message(this.get_label('searching'), 'loading', true);
@@ -2885,7 +2918,7 @@
    this.subscription_list.addEventListener('dragend', function(o){ p.subscription_move_folder(o); });
    this.subscription_list.row_init = function (row)
      {
      var anchors = row.obj.getElementsByTagName('A');
      var anchors = row.obj.getElementsByTagName('a');
      if (anchors[0])
        anchors[0].onclick = function() { p.rename_folder(row.id); return false; };
      if (anchors[1])
@@ -3051,7 +3084,8 @@
    if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id)))
      {
      var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']');
      this.name_input = document.createElement('INPUT');
      this.name_input = document.createElement('input');
      this.name_input.type = 'text';
      this.name_input.value = this.env.subscriptionrows[id][0].replace(reg, '');
      reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
@@ -3177,7 +3211,7 @@
    if (!replace)
      row.cells[1].innerHTML = '*';
    
    if (!replace && row.cells[2] && row.cells[2].firstChild.tagName=='INPUT')
    if (!replace && row.cells[2] && row.cells[2].firstChild.tagName.toLowerCase()=='input')
      {
      row.cells[2].firstChild.value = name;
      row.cells[2].firstChild.checked = true;
@@ -3280,11 +3314,11 @@
  this.clone_table_row = function(row)
    {
    var cell, td;
    var new_row = document.createElement('TR');
    var new_row = document.createElement('tr');
    for(var n=0; n<row.cells.length; n++)
      {
      cell = row.cells[n];
      td = document.createElement('TD');
      td = document.createElement('td');
      if (cell.className)
        td.className = cell.className;
@@ -3372,7 +3406,7 @@
        if (button.type=='image' && obj)
        {
          obj.setAttribute('alt', this.get_label(label));
          if ((link = obj.parentNode) && link.tagName == 'A')
          if ((link = obj.parentNode) && link.tagName.toLowerCase() == 'a')
            link.setAttribute('title', this.get_label(label));
        }
        else if (obj)
@@ -3535,7 +3569,7 @@
      if ((cell = thead.rows[0].cells[n+1]) && (col=='from' || col=='to'))
        {
        // if we have links for sorting, it's a bit more complicated...
        if (cell.firstChild && cell.firstChild.tagName=='A')
        if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a')
          {
          cell.firstChild.innerHTML = this.get_label(this.coltypes[n]);
          cell.firstChild.onclick = function(){ return rcmail.command('sort', this.__col, this); };
@@ -3581,7 +3615,7 @@
        + (this.message_list.in_selection(uid) ? ' selected' : '');
    // for performance use DOM instead of jQuery here
    var row = document.createElement('TR');
    var row = document.createElement('tr');
    row.id = 'rcmrow'+uid;
    row.className = css_class;
    
@@ -3601,7 +3635,7 @@
      icon = this.env.unreadicon;
    
    // add icon col
    var col = document.createElement('TD');
    var col = document.createElement('td');
    col.className = 'icon';
    col.innerHTML = icon ? '<img src="'+icon+'" alt="" />' : '';
    row.appendChild(col);
@@ -3609,7 +3643,7 @@
    // add each submitted col
    for (var n = 0; n < this.coltypes.length; n++) {
      var c = this.coltypes[n];
      col = document.createElement('TD');
      col = document.createElement('td');
      col.className = String(c).toLowerCase();
            
      if (c=='flag') {
@@ -3627,7 +3661,6 @@
      }
    this.message_list.insert_row(row, attop);
    this.triggerEvent('insertrow', { uid:uid, row:row });
    // remove 'old' row
    if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize) {
@@ -3754,7 +3787,7 @@
    var rowcount = tbody.rows.length;
    var even = rowcount%2;
    
    var row = document.createElement('TR');
    var row = document.createElement('tr');
    row.id = 'rcmrow'+cid;
    row.className = 'contact '+(even ? 'even' : 'odd');
       
@@ -3763,14 +3796,13 @@
    // add each submitted col
    for (var c in cols) {
      col = document.createElement('TD');
      col = document.createElement('td');
      col.className = String(c).toLowerCase();
      col.innerHTML = cols[c];
      row.appendChild(col);
    }
    
    this.contact_list.insert_row(row);
    this.triggerEvent('insertrow', { cid:cid, row:row });
    
    this.enable_command('export', (this.contact_list.rowcount > 0));
    };