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