alecpl
2009-12-15 58fb6502e3550e59afa8799d36dfce61a18f8b1b
program/js/app.js
@@ -351,7 +351,7 @@
          this.sections_list.addEventListener('select', function(o){ p.section_select(o); });
          this.sections_list.init();
          this.sections_list.focus();
          this.sections_list.select('general');  // open first section by default
          this.sections_list.select_first();  // open first section by default
        }
        else if (this.gui_objects.subscriptionlist)
          this.init_subscription_list();
@@ -466,23 +466,29 @@
    var input_to = $("[name='_to']");
    var input_subject = $("input[name='_subject']");
    var input_message = $("[name='_message']").get(0);
    var html_mode = $("input[name='_is_html']").val() == '1';
    // init live search events
    this.init_address_input_events(input_to);
    this.init_address_input_events($("[name='_cc']"));
    this.init_address_input_events($("[name='_bcc']"));
    if (!html_mode)
      this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length);
    // add signature according to selected identity
    if (input_from.attr('type') == 'select-one' && $("input[name='_draft_saveid']").val() == ''
        && $("input[name='_is_html']").val() != '1') {  // if we have HTML editor, signature is added in callback
        && !html_mode) {  // if we have HTML editor, signature is added in callback
      this.change_identity(input_from[0]);
    }
    else if (!html_mode)
      this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length);
    if (input_to.val() == '')
      input_to.focus();
    else if (input_subject.val() == '')
      input_subject.focus();
    else if (input_message)
    else if (input_message && !html_mode)
      input_message.focus();
    // get summary of all field values
@@ -983,6 +989,10 @@
      
      case 'remove-attachment':
        this.remove_attachment(props);
        break;
      case 'insert-sig':
        this.change_identity($("[name='_from']")[0], true);
        break;
      case 'reply-all':
@@ -1629,15 +1639,15 @@
    // also send search request to get the right messages
    if (this.env.search_request)
      add_url += '&_search='+this.env.search_request;
    // set page=1 if changeing to another mailbox
    if (!page)
    if (!page && this.env.mailbox != mbox)
      {
      page = 1;
      this.env.current_page = page;
      this.show_contentframe(false);
      }
    if (mbox != this.env.mailbox || (mbox == this.env.mailbox && !page && !sort))
      add_url += '&_refresh=1';
@@ -2171,6 +2181,14 @@
      return false;
      }
    // check if all files has been uploaded
    for (var key in this.env.attachments) {
      if (typeof this.env.attachments[key] == 'object' && !this.env.attachments[key].complete) {
        alert(this.get_label('notuploadedwarning'));
        return false;
      }
    }
    // display localized warning for missing subject
    if (input_subject.val() == '')
      {
@@ -2275,113 +2293,142 @@
      str += editor.getContent();
    else
      str += $("[name='_message']").val();
    if (this.env.attachments)
      for (var upload_id in this.env.attachments)
        str += upload_id;
    if (save)
      this.cmp_hash = str;
    return str;
    };
    
  this.change_identity = function(obj)
    {
  this.change_identity = function(obj, show_sig)
  {
    if (!obj || !obj.options)
      return false;
    if (!show_sig)
      show_sig = this.env.show_sig;
    var id = obj.options[obj.selectedIndex].value;
    var input_message = $("[name='_message']");
    var message = input_message.val();
    var is_html = ($("input[name='_is_html']").val() == '1');
    var sig, p, len;
    var sig, cursor_pos, p = -1;
    if (!this.env.identity)
      this.env.identity = id
  
    if (!is_html)
      {
    // enable manual signature insert
    if (this.env.signatures && this.env.signatures[id])
      this.enable_command('insert-sig', true);
    else
      this.enable_command('insert-sig', false);
    if (!is_html) {
      // remove the 'old' signature
      if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity])
        {
        if (this.env.signatures[this.env.identity]['is_html'])
          sig = this.env.signatures[this.env.identity]['plain_text'];
        else
          sig = this.env.signatures[this.env.identity]['text'];
      if (show_sig && this.env.identity && this.env.signatures && this.env.signatures[this.env.identity]) {
        sig = this.env.signatures[this.env.identity].is_html ? this.env.signatures[this.env.identity].plain_text : this.env.signatures[this.env.identity].text;
        
        if (sig.indexOf('-- ')!=0)
        if (sig.indexOf('-- ') != 0)
          sig = '-- \n'+sig;
        p = message.lastIndexOf(sig);
        if (p>=0)
          message = message.substring(0, p-1) + message.substring(p+sig.length, message.length);
        }
      message = message.replace(/[\r\n]+$/, '');
      len = message.length;
        p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig);
        if (p >= 0)
          message = message.substring(0, p) + message.substring(p+sig.length, message.length);
      }
      // add the new signature string
      if (this.env.signatures && this.env.signatures[id])
        {
        sig = this.env.signatures[id]['text'];
        if (this.env.signatures[id]['is_html'])
          {
          sig = this.env.signatures[id]['plain_text'];
          }
        if (sig.indexOf('-- ')!=0)
      if (show_sig && this.env.signatures && this.env.signatures[id]) {
        sig = this.env.signatures[id]['is_html'] ? this.env.signatures[id]['plain_text'] : this.env.signatures[id]['text'];
        if (sig.indexOf('-- ') != 0)
          sig = '-- \n'+sig;
        message += '\n\n'+sig;
   if (len) len += 1;
        if (this.env.sig_above) {
          if (p >= 0) { // in place of removed signature
            message = message.substring(0, p) + sig + message.substring(p, message.length);
            cursor_pos = p - 1;
          }
          else if (pos = this.get_caret_pos(input_message.get(0))) { // at cursor position
            message = message.substring(0, pos) + '\n' + sig + '\n\n' + message.substring(pos, message.length);
            cursor_pos = pos;
          }
          else { // on top
            cursor_pos = 0;
            message = '\n\n' + sig + '\n\n' + message.replace(/^[\r\n]+/, '');
          }
        }
        else {
          message = message.replace(/[\r\n]+$/, '');
          cursor_pos = !this.env.top_posting && message.length ? message.length+1 : 0;
          message += '\n\n' + sig;
        }
      }
    else
      {
      else
        cursor_pos = this.env.top_posting ? 0 : message.length;
      input_message.val(message);
      // move cursor before the signature
      this.set_caret_pos(input_message.get(0), cursor_pos);
    }
    else if (is_html && show_sig && this.env.signatures) {  // html
      var editor = tinyMCE.get(this.env.composebody);
      var sigElem = editor.dom.get('_rc_sig');
      if (this.env.signatures)
        {
        // Append the signature as a div within the body
        var sigElem = editor.dom.get('_rc_sig');
        var newsig = '';
        var htmlsig = true;
        if (!sigElem)
          {
          // add empty line before signature on IE
          if (bw.ie)
            editor.getBody().appendChild(editor.getDoc().createElement('br'));
          sigElem = editor.getDoc().createElement('div');
          sigElem.setAttribute('id', '_rc_sig');
          editor.getBody().appendChild(sigElem);
      // Append the signature as a div within the body
      if (!sigElem) {
        var body = editor.getBody();
        var doc = editor.getDoc();
        sigElem = doc.createElement('div');
        sigElem.setAttribute('id', '_rc_sig');
        if (this.env.sig_above) {
          // if no existing sig and top posting then insert at caret pos
          editor.getWin().focus(); // correct focus in IE
          var node = editor.selection.getNode();
          if (node.nodeName == 'BODY') {
            // no real focus, insert at start
            body.insertBefore(sigElem, body.firstChild);
            body.insertBefore(doc.createElement('br'), body.firstChild);
          }
        if (this.env.signatures[id])
        {
          newsig = this.env.signatures[id]['text'];
          htmlsig = this.env.signatures[id]['is_html'];
          if (newsig) {
            if (htmlsig && this.env.signatures[id]['plain_text'].indexOf('-- ')!=0)
              newsig = '<p>-- </p>' + newsig;
            else if (!htmlsig && newsig.indexOf('-- ')!=0)
              newsig = '-- \n' + newsig;
          else {
            body.insertBefore(sigElem, node.nextSibling);
            body.insertBefore(doc.createElement('br'), node.nextSibling);
          }
        }
        else {
          if (bw.ie)  // add empty line before signature on IE
            body.appendChild(doc.createElement('br'));
        if (htmlsig)
          sigElem.innerHTML = newsig;
        else
          sigElem.innerHTML = '<pre>' + newsig + '</pre>';
          body.appendChild(sigElem);
        }
      }
    input_message.val(message);
      if (this.env.signatures[id]) {
        if (this.env.signatures[id].is_html) {
          sig = this.env.signatures[id].text;
          if (this.env.signatures[id].plain_text.indexOf('-- ') != 0)
            sig = '-- <br />' + sig;
        }
        else {
          sig = this.env.signatures[id].text;
          if (sig.indexOf('-- ') != 0)
            sig = '-- \n' + sig;
          sig = '<pre>' + sig + '</pre>';
        }
    // move cursor before the signature
    if (!is_html)
      this.set_caret_pos(input_message.get(0), len);
        sigElem.innerHTML = sig;
      }
    }
    this.env.identity = id;
    return true;
    };
  };
  this.show_attachment_form = function(a)
    {
@@ -2450,10 +2497,42 @@
        document.body.appendChild(frame);
        }
      // handle upload errors, parsing iframe content in onload
      var fr = document.getElementsByName(frame_name)[0];
      $(fr).bind('load', {ts:ts}, function(e) {
        var content = '';
        try {
          if (this.contentDocument) {
            var d = this.contentDocument;
          } else if (this.contentWindow) {
            var d = this.contentWindow.document;
          }
          content = d.childNodes[0].innerHTML;
        } catch (e) {}
        if (!String(content).match(/add2attachment/) && (!bw.opera || (rcmail.env.uploadframe && rcmail.env.uploadframe == e.data.ts))) {
          rcmail.display_message(rcmail.get_label('fileuploaderror'), 'error');
          rcmail.remove_from_attachment_list(e.data.ts);
        }
        // Opera hack: handle double onload
        if (bw.opera)
          rcmail.env.uploadframe = e.data.ts;
      });
      form.target = frame_name;
      form.action = this.env.comm_path+'&_action=upload';
      form.action = this.env.comm_path+'&_action=upload&_uploadid='+ts;
      form.setAttribute('enctype', 'multipart/form-data');
      form.submit();
      // hide upload form
      this.show_attachment_form(false);
      // display upload indicator and cancel button
      var content = this.get_label('uploading');
      if (this.env.loadingicon)
        content = '<img src="'+this.env.loadingicon+'" alt="" />'+content;
      if (this.env.cancelicon)
        content = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+ts+'\', \''+frame_name+'\');" href="#cancelupload"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content;
      this.add2attachment_list(ts, { name:'', html:content, complete:false });
      }
    
    // set reference to the form object
@@ -2463,17 +2542,35 @@
  // add file name to attachment list
  // called from upload page
  this.add2attachment_list = function(name, content)
    {
  this.add2attachment_list = function(name, att, upload_id)
  {
    if (!this.gui_objects.attachmentlist)
      return false;
    $('<li>').attr('id', name).html(content).appendTo(this.gui_objects.attachmentlist);
    var li = $('<li>').attr('id', name).html(att.html);
    var indicator;
    // replace indicator's li
    if (upload_id && (indicator = document.getElementById(upload_id))) {
      li.replaceAll(indicator);
    }
    else { // add new li
      li.appendTo(this.gui_objects.attachmentlist);
    }
    if (upload_id && this.env.attachments[upload_id])
      delete this.env.attachments[upload_id];
    this.env.attachments[name] = att;
    return true;
    };
  };
  this.remove_from_attachment_list = function(name)
    {
  {
    if (this.env.attachments[name])
      delete this.env.attachments[name];
    if (!this.gui_objects.attachmentlist)
      return false;
@@ -2481,14 +2578,24 @@
    for (i=0;i<list.length;i++)
      if (list[i].id == name)
        this.gui_objects.attachmentlist.removeChild(list[i]);
    };
  };
  this.remove_attachment = function(name)
    {
    if (name)
    if (name && this.env.attachments[name])
      this.http_post('remove-attachment', '_file='+urlencode(name));
    return true;
    };
  this.cancel_attachment_upload = function(name, frame_name)
    {
    if (!name || !frame_name)
      return false;
    this.remove_from_attachment_list(name);
    $("iframe[name='"+frame_name+"']").remove();
    return false;
    };
  // send remote request to add a new contact
@@ -2508,11 +2615,11 @@
      var addurl = '';
      if (this.message_list) {
        this.message_list.clear();
   if (this.env.search_mods) {
        if (this.env.search_mods) {
          var head_arr = new Array();
          for (var n in this.env.search_mods)
       head_arr.push(n);
     addurl += '&_headers='+head_arr.join(',');
            head_arr.push(n);
          addurl += '&_headers='+head_arr.join(',');
          }
        } else if (this.contact_list) {
        this.contact_list.clear(true);
@@ -3018,7 +3125,6 @@
        add_url = '&_framed=1';
        target = window.frames[this.env.contentframe];
        }
      target.location.href = this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url;
      }
@@ -3842,8 +3948,12 @@
  // replace content of quota display
  this.set_quota = function(content)
    {
    if (content && this.gui_objects.quotadisplay)
      $(this.gui_objects.quotadisplay).html(content);
    if (content && this.gui_objects.quotadisplay) {
      if (typeof(content) == 'object')
        this.percent_indicator(this.gui_objects.quotadisplay, content);
      else
        $(this.gui_objects.quotadisplay).html(content);
      }
    };
  // update the mailboxlist
@@ -3972,6 +4082,61 @@
    elem.onclick = function() { rcmail.load_headers(elem); }
    }
  // percent (quota) indicator
  this.percent_indicator = function(obj, data)
    {
    if (!data || !obj)
      return false;
    var limit_high = 80;
    var limit_mid  = 55;
    var width = data.width ? data.width : this.env.indicator_width ? this.env.indicator_width : 100;
    var height = data.height ? data.height : this.env.indicator_height ? this.env.indicator_height : 14;
    var quota = data.percent ? Math.abs(parseInt(data.percent)) : 0;
    var quota_width = parseInt(quota / 100 * width);
    var pos = $(obj).position();
    this.env.indicator_width = width;
    this.env.indicator_height = height;
    // overlimit
    if (quota_width > width) {
      quota_width = width;
      quota = 100;
      }
    // main div
    var main = $('<div>');
    main.css({position: 'absolute', top: pos.top, left: pos.left,
   width: width + 'px', height: height + 'px', zIndex: 100, lineHeight: height + 'px'})
   .attr('title', data.title).addClass('quota_text').html(quota + '%');
    // used bar
    var bar1 = $('<div>');
    bar1.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1,
   width: quota_width + 'px', height: height + 'px', zIndex: 99});
    // background
    var bar2 = $('<div>');
    bar2.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1,
   width: width + 'px', height: height + 'px', zIndex: 98})
   .addClass('quota_bg');
    if (quota >= limit_high) {
      main.addClass(' quota_text_high');
      bar1.addClass('quota_high');
      }
    else if(quota >= limit_mid) {
      main.addClass(' quota_text_mid');
      bar1.addClass('quota_mid');
      }
    else {
      main.addClass(' quota_text_normal');
      bar1.addClass('quota_low');
      }
    // replace quota image
    obj.innerHTML = '';
    $(obj).append(bar1).append(bar2).append(main);
    }
  /********************************************************/
  /*********  html to text conversion functions   *********/
@@ -4027,7 +4192,7 @@
    var url = this.env.comm_path + '&_action=' + action + '&' + querystring
    
    // send request
    console.log('HTTP POST: ' + url);
    console.log('HTTP GET: ' + url);
    jQuery.get(url, { _unlock:(lock?1:0) }, function(data){ ref.http_response(data); }, 'json');
  };
@@ -4254,4 +4419,3 @@
rcube_webmail.prototype.addEventListener = rcube_event_engine.prototype.addEventListener;
rcube_webmail.prototype.removeEventListener = rcube_event_engine.prototype.removeEventListener;
rcube_webmail.prototype.triggerEvent = rcube_event_engine.prototype.triggerEvent;