script.js revision f70fc4052b72a850bbb9be585d0f5a4877ee9448
1f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang/* 2f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * Copyright (C) 2012 Google Inc. 3f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * Licensed to The Android Open Source Project. 4f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * 5f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * Licensed under the Apache License, Version 2.0 (the "License"); 6f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * you may not use this file except in compliance with the License. 7f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * You may obtain a copy of the License at 8f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * 9f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * http://www.apache.org/licenses/LICENSE-2.0 10f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * 11f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * Unless required by applicable law or agreed to in writing, software 12f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * distributed under the License is distributed on an "AS IS" BASIS, 13f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * See the License for the specific language governing permissions and 15f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * limitations under the License. 16f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang */ 17f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 18f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 19f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang/** 20f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * Returns the page offset of an element. 21f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * 22f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * @param {Element} element The element to return the page offset for. 23f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * @return {left: number, top: number} A tuple including a left and top value representing 24f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang * the page offset of the element. 25f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang */ 26f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huangfunction getTotalOffset(el) { 27f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var result = { 28f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang left: 0, 29f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang top: 0 30f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang }; 31f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var parent = el; 32f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 33f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang while (parent) { 34f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang result.left += parent.offsetLeft; 35f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang result.top += parent.offsetTop; 36f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang parent = parent.offsetParent; 37f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang } 38f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 39f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang return result; 40f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang} 41f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 42f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huangfunction toggleQuotedText(e) { 43f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var toggleElement = e.target; 44f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var elidedTextElement = toggleElement.nextSibling; 45f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var isHidden = getComputedStyle(elidedTextElement).display == 'none'; 46f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang toggleElement.innerHTML = isHidden ? MSG_HIDE_ELIDED : MSG_SHOW_ELIDED; 47f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang elidedTextElement.style.display = isHidden ? 'block' : 'none'; 48f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang} 49f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 50f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huangfunction collapseQuotedText() { 51f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var i; 52f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var elements = document.getElementsByClassName("elided-text"); 53f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var elidedElement, toggleElement; 54f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang for (i = 0; i < elements.length; i++) { 55f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang elidedElement = elements[i]; 56f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang toggleElement = document.createElement("div"); 57f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang toggleElement.display = "mail-elided-text"; 58f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang toggleElement.innerHTML = MSG_SHOW_ELIDED; 59f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang toggleElement.onclick = toggleQuotedText; 60f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang elidedElement.parentNode.insertBefore(toggleElement, elidedElement); 61f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang } 62f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang} 63f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 64f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huangfunction shrinkWideMessages() { 65f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var i; 66f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var elements = document.getElementsByClassName("mail-message-content"); 67f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var messageElement; 68f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var documentWidth = document.documentElement.offsetWidth; 69f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var scale; 70f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang for (i = 0; i < elements.length; i++) { 71f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageElement = elements[i]; 72f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang if (messageElement.scrollWidth > documentWidth) { 73f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang scale = documentWidth / messageElement.scrollWidth; 74f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 75f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang // TODO: 'zoom' is nice because it does a proper layout, but WebView seems to clamp the 76f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang // minimum 'zoom' level. 77f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang if (false) { 78f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang // TODO: this alternative works well in Chrome but doesn't work in WebView. 79f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageElement.style.webkitTransformOrigin = "left top"; 80f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageElement.style.webkitTransform = "scale(" + scale + ")"; 81f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageElement.style.height = (messageElement.offsetHeight * scale) + "px"; 82f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageElement.style.overflowX = "visible"; 83f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang } else { 84f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageElement.style.zoom = documentWidth / messageElement.scrollWidth; 85f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang } 86f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang } 87f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang } 88f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang} 89f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 90f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huangfunction measurePositions() { 91f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var messageTops; 92f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var i; 93f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var len; 94f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 95f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang var headers = document.querySelectorAll(".mail-message"); 96f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 97f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageTops = new Array(headers.length); 98f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang for (i = 0, len = headers.length; i < len; i++) { 99f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang // addJavascriptInterface handler only supports string arrays 100f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang messageTops[i] = "" + getTotalOffset(headers[i]).top; 101f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang } 102f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 103f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang window.mail.onWebContentGeometryChange(messageTops); 104f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang} 105f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 106f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy HuangcollapseQuotedText(); 107f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy HuangshrinkWideMessages(); 108f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy HuangmeasurePositions(); 109f70fc4052b72a850bbb9be585d0f5a4877ee9448Andy Huang 110