From 01ffe039089e08fd6faaf03f4170853defd41fc8 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 06 Oct 2009 02:55:08 -0400
Subject: [PATCH] Hold attachment info in a js list in order to simplify things + codestyle

---
 program/js/editor_images.js        |   20 ++-------
 program/steps/mail/attachments.inc |    6 ++
 program/steps/mail/compose.inc     |    6 ++
 program/js/app.js                  |   78 +++++++++++++++++++++------------------
 4 files changed, 57 insertions(+), 53 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index d416171..d72f9ee 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -2172,14 +2172,11 @@
       }
 
     // check if all files has been uploaded
-    if (this.gui_objects.attachmentlist) {
-      var list = this.gui_objects.attachmentlist.getElementsByTagName("li");
-      for (i=0;i<list.length;i++)
-        if (!String(list[i].id).match(/^rcmfile/))
-          {
-          alert(this.get_label('notuploadedwarning'));
-          return false;
-          }
+    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
@@ -2464,23 +2461,23 @@
       // handle upload errors, parsing iframe content in onload
       var fr = document.getElementsByName(frame_name)[0];
       $(fr).bind('load', {ts:ts}, function(e) {
-	var content = '';
+        var content = '';
         try {
           if (this.contentDocument) {
-	    var d = this.contentDocument;
-	  } else if (this.contentWindow) {
-	    var d = this.contentWindow.document;
-	  }
-	  content = d.childNodes[0].innerHTML;
+            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);
+        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;
+        // Opera hack: handle double onload
+        if (bw.opera)
+          rcmail.env.uploadframe = e.data.ts;
       });
 
       form.target = frame_name;
@@ -2496,7 +2493,7 @@
         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, content);
+      this.add2attachment_list(ts, { name:'', html:content, complete:false });
       }
     
     // set reference to the form object
@@ -2506,26 +2503,35 @@
 
   // add file name to attachment list
   // called from upload page
-  this.add2attachment_list = function(name, content, upload_id)
-    {
+  this.add2attachment_list = function(name, att, upload_id)
+  {
     if (!this.gui_objects.attachmentlist)
       return false;
     
+    var li = $('<li>').attr('id', name).html(att.html);
     var indicator;
+    
     // replace indicator's li
     if (upload_id && (indicator = document.getElementById(upload_id))) {
-      var li = document.createElement('li');
-      $(li).attr('id', name).html(content);
-      indicator.parentNode.replaceChild(li, indicator);
-      } else { // add new li
-      $('<li>').attr('id', name).html(content).appendTo(this.gui_objects.attachmentlist);
-      }
+      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;
 
@@ -2533,11 +2539,11 @@
     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;
@@ -2570,11 +2576,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);
diff --git a/program/js/editor_images.js b/program/js/editor_images.js
index 36fc1ab..2faafd3 100644
--- a/program/js/editor_images.js
+++ b/program/js/editor_images.js
@@ -1,22 +1,12 @@
 
 var rc_client = tinyMCEPopup.getParam("rc_client");
-if (rc_client.gui_objects.attachmentlist)
+if (rc_client.env.attachments)
 {
    var tinyMCEImageList = new Array();
-   var attachElems = rc_client.gui_objects.attachmentlist.getElementsByTagName("li");
-   for (i = 0; i < attachElems.length; i++)
+   for (var id in rc_client.env.attachments)
    {
-      var liElem = attachElems[i];
-      var fname = attachElems[i].id;
-      for (j = 0; j < liElem.childNodes.length; j++)
-      {
-         if (liElem.childNodes[j].nodeName == "#text")
-         {
-            fname = liElem.childNodes[j].nodeValue;
-         }
-      }
-      
-      if (fname.match(/\.(bmp|gif|png|jpg|jpeg)$/))
-        tinyMCEImageList.push([fname, rc_client.env.comm_path+'&_action=display-attachment&_file='+attachElems[i].id]);
+      var att = rc_client.env.attachments[id];
+      if (att.complete && att.mimetype.indexOf('image/') == 0)
+        tinyMCEImageList.push([att.name, rc_client.env.comm_path+'&_action=display-attachment&_file='+id]);
    }
 };
diff --git a/program/steps/mail/attachments.inc b/program/steps/mail/attachments.inc
index 28d6108..d97b9c4 100644
--- a/program/steps/mail/attachments.inc
+++ b/program/steps/mail/attachments.inc
@@ -111,7 +111,11 @@
 
       $content .= Q($attachment['name']);
       
-      $OUTPUT->command('add2attachment_list', "rcmfile$id", $content, $uploadid);
+      $OUTPUT->command('add2attachment_list', "rcmfile$id", array(
+        'html' => $content,
+        'name' => $attachment['name'],
+        'mimetype' => $attachment['mimetype'],
+        'complete' => true), $uploadid);
     }
     else {  // upload failed
       $err = $_FILES['_attachments']['error'][$i];
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index c894da7..276efda 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -781,6 +781,7 @@
     $attrib['id'] = 'rcmAttachmentList';
   
   $out = "\n";
+  $jslist = array();
   
   if (is_array($_SESSION['compose']['attachments']))
   {
@@ -798,12 +799,14 @@
       if (empty($a_prop))
         continue;
       
-      $out .= html::tag('li', array('id' => "rcmfile".$id),
+      $out .= html::tag('li', array('id' => 'rcmfile'.$id),
         html::a(array(
             'href' => "#delete",
             'title' => rcube_label('delete'),
             'onclick' => sprintf("return %s.command('remove-attachment','rcmfile%s', this)", JS_OBJECT_NAME, $id)),
           $button) . Q($a_prop['name']));
+        
+        $jslist['rcmfile'.$id] = array('name' => $a_prop['name'], 'complete' => true, 'mimetype' => $a_prop['mimetype']);
     }
   }
 
@@ -814,6 +817,7 @@
   if ($attrib['loadingicon'])
     $OUTPUT->set_env('loadingicon', $CONFIG['skin_path'] . $attrib['loadingicon']);
 
+  $OUTPUT->set_env('attachments', $jslist);
   $OUTPUT->add_gui_object('attachmentlist', $attrib['id']);
     
   return html::tag('ul', $attrib, $out, html::$common_attrib);

--
Gitblit v1.9.1