support message header collapsing

* toggle header collapse/expand
* initially render read messages collapsed
* collapse removes attachments footer and stops loader
* expand creates/reuses attachments footer, but ONLY if visible
* can (mostly) expand/collapse details
* can expand/collapse quoted text
* add lots of logging (disabled during scrolling!) to catch
  strange layouts

Change-Id: I73f533c91d24ef1c05919d0a3b396f276898107a
diff --git a/assets/script.js b/assets/script.js
index a68db32..da380e6 100644
--- a/assets/script.js
+++ b/assets/script.js
@@ -46,6 +46,7 @@
     var isHidden = getComputedStyle(elidedTextElement).display == 'none';
     toggleElement.innerHTML = isHidden ? MSG_HIDE_ELIDED : MSG_SHOW_ELIDED;
     elidedTextElement.style.display = isHidden ? 'block' : 'none';
+    measurePositions();
 }
 
 function collapseQuotedText() {
@@ -166,6 +167,32 @@
         }
     }
 }
+
+function setMessageHeaderSpacerHeight(messageDomId, spacerHeight) {
+    var spacer = document.querySelector("#" + messageDomId + " > .mail-message-header");
+    if (!spacer) {
+        console.log("can't set spacer for message with id: " + messageDomId);
+        return;
+    }
+    spacer.style.height = spacerHeight + "px";
+    measurePositions();
+}
+
+function setMessageBodyVisible(messageDomId, isVisible, spacerHeight) {
+    var i, len;
+    var visibility = isVisible ? "block" : "none";
+    var messageDiv = document.querySelector("#" + messageDomId);
+    var collapsibleDivs = document.querySelectorAll("#" + messageDomId + " > .collapsible");
+    if (!messageDiv || collapsibleDivs.length == 0) {
+        console.log("can't set body visibility for message with id: " + messageDomId);
+        return;
+    }
+    messageDiv.classList.toggle("expanded");
+    for (i = 0, len = collapsibleDivs.length; i < len; i++) {
+        collapsibleDivs[i].style.display = visibility;
+    }
+    setMessageHeaderSpacerHeight(messageDomId, spacerHeight);
+}
 // END Java->JavaScript handlers
 
 collapseQuotedText();