Files
evolution/data/webkit/e-web-view.js

1918 lines
49 KiB
JavaScript

/* -*- Mode: javascript; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2019 Red Hat (www.redhat.com)
*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
'use strict';
/* semi-convention: private functions start with lower-case letter,
public functions start with upper-case letter. */
var Evo = {
hasSelection : false,
blockquoteStyle : "margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex",
magicSpacebarState: -1,
markCitationColor : null,
plugins : null
};
Evo.RegisterPlugin = function(plugin)
{
if (plugin == null)
return;
if (plugin.name === undefined) {
console.error("Evo.RegisterPlugin: Plugin '" + plugin + "' has missing 'name' member");
return;
}
if (plugin.setup === undefined) {
console.error("Evo.RegisterPlugin: Plugin '" + plugin.name + "' has missing 'setup' function");
return;
}
if (Evo.plugins == null)
Evo.plugins = [];
Evo.plugins.push(plugin);
}
Evo.setupPlugins = function(doc)
{
if (Evo.plugins == null)
return;
var ii;
for (ii = 0; ii < Evo.plugins.length; ii++) {
try {
if (Evo.plugins[ii] != null)
Evo.plugins[ii].setup(doc);
} catch (err) {
console.error("Failed to setup plugin '" + Evo.plugins[ii].name + "': " + err.name + ": " + err.message);
Evo.plugins[ii] = null;
}
}
}
/* The 'traversar_obj' is an object, which implements a callback function:
boolean exec(doc, iframe_id, level);
and it returns whether continue the traversar */
Evo.foreachIFrameDocument = function(doc, traversar_obj, call_also_for_doc, level)
{
if (!doc)
return false;
if (call_also_for_doc && !traversar_obj.exec(doc, doc.defaultView.frameElement ? doc.defaultView.frameElement.id : "", level))
return false;
var iframes, ii;
iframes = doc.getElementsByTagName("iframe");
for (ii = 0; ii < iframes.length; ii++) {
if (!iframes[ii].contentDocument)
continue;
if (!traversar_obj.exec(iframes[ii].contentDocument, iframes[ii].id, level + 1))
return false;
if (!Evo.foreachIFrameDocument(iframes[ii].contentDocument, traversar_obj, false, level + 1))
return false;
}
return true;
}
Evo.findIFrame = function(iframe_id)
{
if (iframe_id == "")
return null;
var traversar = {
iframe_id : iframe_id,
iframe : null,
exec : function(doc, iframe_id, level) {
if (iframe_id == this.iframe_id) {
this.iframe = doc.defaultView.frameElement;
return false;
}
return true;
}
};
Evo.foreachIFrameDocument(document, traversar, true, 0);
return traversar.iframe;
}
Evo.findIFrameDocument = function(iframe_id)
{
if (iframe_id == "")
return document;
var iframe = Evo.findIFrame(iframe_id);
if (iframe)
return iframe.contentDocument;
return null;
}
Evo.runTraversarForIFrameId = function(iframe_id, traversar_obj)
{
if (iframe_id == "*") {
Evo.foreachIFrameDocument(document, traversar_obj, true, 0);
} else {
var doc = Evo.findIFrameDocument(iframe_id);
if (doc) {
var level = 0, parent;
for (parent = doc.defaultView.frameElement; parent; parent = parent.ownerDocument.defaultView.frameElement) {
level++;
}
traversar_obj.exec(doc, iframe_id, level);
}
}
}
Evo.findElementInDocumentById = function(doc, element_id)
{
if (!doc)
return null;
if (element_id == "*html")
return doc.documentElement;
if (element_id == "*head")
return doc.head;
if (element_id == "*body")
return doc.body;
return doc.getElementById(element_id);
}
Evo.FindElement = function(iframe_id, element_id)
{
var traversar = {
element_id : element_id,
res : null,
exec : function(doc, iframe_id, level) {
this.res = Evo.findElementInDocumentById(doc, this.element_id);
if (this.res)
return false;
return true;
}
};
Evo.runTraversarForIFrameId(iframe_id, traversar);
return traversar.res;
}
Evo.SetElementHidden = function(iframe_id, element_id, value)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem)
elem.hidden = value;
}
Evo.SetElementDisabled = function(iframe_id, element_id, value)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem)
elem.disabled = value;
}
Evo.SetElementChecked = function(iframe_id, element_id, value)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem)
elem.checked = value;
}
Evo.SetElementStyleProperty = function(iframe_id, element_id, property_name, value)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
if (value != null && value != "")
elem.style.setProperty(property_name, value);
else
elem.style.removeProperty(property_name);
}
}
Evo.SetElementAttribute = function(iframe_id, element_id, namespace_uri, qualified_name, value)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
if (value != null && value != "")
elem.setAttributeNS(namespace_uri, qualified_name, value);
else
elem.removeAttributeNS(namespace_uri, qualified_name);
}
}
Evo.createStyleSheet = function(doc, style_sheet_id, content)
{
var node;
node = doc.createElement("style");
node.id = style_sheet_id;
node.media = "screen";
node.innerText = content;
doc.head.append(node);
return node;
}
Evo.CreateStyleSheet = function(iframe_id, style_sheet_id, content)
{
var doc = Evo.findIFrameDocument(iframe_id);
if (!doc)
return;
var styles = doc.head.getElementsByTagName("style"), ii;
for (ii = 0; ii < styles.length; ii++) {
if (styles[ii].id == style_sheet_id) {
styles[ii].innerText = content;
return;
}
}
Evo.createStyleSheet(doc, style_sheet_id, content);
}
Evo.RemoveStyleSheet = function(iframe_id, style_sheet_id)
{
var traversar = {
style_sheet_id : style_sheet_id,
exec : function(doc, iframe_id, level) {
if (doc && doc.head) {
var ii, styles = doc.head.getElementsByTagName("style");
for (ii = styles.length - 1; ii >= 0; ii--) {
if (this.style_sheet_id == "*" || styles[ii].id == this.style_sheet_id) {
doc.head.removeChild(styles[ii]);
}
}
}
return true;
}
};
Evo.runTraversarForIFrameId(iframe_id, traversar);
}
Evo.addRuleIntoStyleSheetDocument = function(doc, style_sheet_id, selector, style)
{
var styles = doc.head.getElementsByTagName("style"), ii, styleobj = null;
for (ii = 0; ii < styles.length; ii++) {
if (styles[ii].id == style_sheet_id) {
styleobj = styles[ii];
break;
}
}
if (!styleobj) {
Evo.createStyleSheet(doc, style_sheet_id, selector + " { " + style + " }");
return;
}
for (ii = 0; ii < styleobj.sheet.cssRules.length; ii++) {
if (styleobj.sheet.cssRules[ii].selectorText == selector) {
styleobj.sheet.cssRules[ii].style.cssText = style;
return;
}
}
styleobj.sheet.addRule(selector, style);
}
Evo.AddRuleIntoStyleSheet = function(iframe_id, style_sheet_id, selector, style)
{
var traversar = {
style_sheet_id : style_sheet_id,
selector : selector,
style : style,
exec : function(doc, iframe_id, level) {
if (doc && doc.head) {
Evo.addRuleIntoStyleSheetDocument(doc, this.style_sheet_id, this.selector, this.style);
}
return true;
}
};
Evo.runTraversarForIFrameId(iframe_id, traversar);
}
Evo.SetDocumentContent = function(content)
{
document.documentElement.innerHTML = content;
Evo.initialize(null);
window.webkit.messageHandlers.contentLoaded.postMessage("");
}
Evo.SetIFrameSrc = function(iframe_id, src_uri)
{
var iframe = Evo.findIFrame(iframe_id);
if (iframe)
iframe.src = src_uri;
}
Evo.SetIFrameContent = function(iframe_id, content)
{
var iframe = Evo.findIFrame(iframe_id);
if (iframe) {
iframe.contentDocument.documentElement.innerHTML = content;
Evo.initialize(iframe);
window.webkit.messageHandlers.contentLoaded.postMessage(iframe_id);
}
}
Evo.elementClicked = function(elem)
{
var with_parents_left, with_parents_top, scroll_x = 0, scroll_y = 0, offset_parent, dom_window;
var parent_iframe_id = "";
if (elem.ownerDocument.defaultView.frameElement)
parent_iframe_id = elem.ownerDocument.defaultView.frameElement.id;
with_parents_left = elem.offsetLeft;
with_parents_top = elem.offsetTop;
offset_parent = elem;
while (offset_parent = offset_parent.offsetParent, offset_parent) {
with_parents_left += offset_parent.offsetLeft;
with_parents_top += offset_parent.offsetTop;
}
dom_window = elem.ownerDocument.defaultView;
while (dom_window instanceof Window) {
var parent_dom_window, iframe_elem;
parent_dom_window = dom_window.parent;
iframe_elem = dom_window.frameElement;
while (iframe_elem) {
with_parents_left += iframe_elem.offsetLeft;
with_parents_top += iframe_elem.offsetTop;
iframe_elem = iframe_elem.offsetParent;
}
scroll_x += dom_window.scrollX;
scroll_y += dom_window.scrollY;
if (parent_dom_window == dom_window)
break;
dom_window = parent_dom_window;
}
var res = [];
res["iframe-id"] = parent_iframe_id;
res["elem-id"] = elem.id;
res["elem-class"] = elem.className;
res["elem-value"] = elem.getAttribute("value");
res["left"] = with_parents_left - scroll_x;
res["top"] = with_parents_top - scroll_y;
res["width"] = elem.offsetWidth;
res["height"] = elem.offsetHeight;
window.webkit.messageHandlers.elementClicked.postMessage(res);
}
Evo.RegisterElementClicked = function(iframe_id, elem_classes_str)
{
var traversar = {
elem_classes : elem_classes_str.split("\n"),
exec : function(doc, iframe_id, level) {
if (doc && this.elem_classes) {
var ii;
for (ii = 0; ii < this.elem_classes.length; ii++) {
if (this.elem_classes[ii] != "") {
var jj, elems;
elems = doc.getElementsByClassName(this.elem_classes[ii]);
for (jj = 0; jj < elems.length; jj++) {
elems[jj].onclick = function() { Evo.elementClicked(this); };
}
}
}
}
return true;
}
};
Evo.runTraversarForIFrameId(iframe_id, traversar);
}
Evo.checkAnyParentIsPre = function(node)
{
if (!node)
return false;
while (node = node.parentElement, node) {
if (/* node instanceof HTMLPreElement */ node.tagName == "PRE")
return true;
if (/* node instanceof HTMLIFrameElement */ node.tagName == "IFRAME")
break;
}
return false;
}
Evo.getElementContent = function(node, format, useOuterHTML)
{
if (!node)
return null;
var data;
if (format == 1) {
data = EvoConvert.ToPlainText(node);
} else if (format == 2) {
data = useOuterHTML ? node.outerHTML : node.innerHTML;
} else if (format == 3) {
data = {};
data["plain"] = EvoConvert.ToPlainText(node);
data["html"] = useOuterHTML ? node.outerHTML : node.innerHTML;
}
return data;
}
Evo.checkHasSelection = function(content)
{
var traversar = {
content : content,
has : false,
exec : function(doc, iframe_id, level) {
if (doc && !doc.defaultView.getSelection().isCollapsed) {
if (content) {
var fragment, node, inpre;
fragment = doc.defaultView.getSelection().getRangeAt(0).cloneContents();
inpre = Evo.checkAnyParentIsPre(doc.defaultView.getSelection().getRangeAt(0).startContainer);
node = doc.createElement(inpre ? "PRE" : "DIV");
node.appendChild(fragment);
content.data = Evo.getElementContent(node, content.format, inpre);
}
this.has = true;
return false;
}
return true;
}
};
Evo.foreachIFrameDocument(document, traversar, true, 0);
return traversar.has;
}
Evo.selectionChanged = function()
{
var has;
has = Evo.checkHasSelection(null);
if (has != Evo.hasSelection) {
Evo.hasSelection = has;
window.webkit.messageHandlers.hasSelection.postMessage(has);
}
}
Evo.GetSelection = function(format)
{
var content = { format: 0, data: null };
content.format = format;
if (!Evo.checkHasSelection(content))
return null;
return content.data;
}
Evo.GetDocumentContent = function(iframe_id, format)
{
var doc;
if (iframe_id == "") {
doc = document;
} else {
var iframe = Evo.findIFrame(iframe_id);
if (!iframe)
return null;
doc = iframe.contentDocument;
}
return Evo.getElementContent(doc.documentElement, format, true);
}
Evo.GetElementContent = function(iframe_id, element_id, format, use_outer_html)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (!elem)
return null;
return Evo.getElementContent(elem, format, use_outer_html);
}
Evo.findElementFromPoint = function(doc, xx, yy, parent_elem)
{
var elem;
if (!parent_elem) {
elem = doc.elementFromPoint(xx, yy);
} else {
var left_offset = 0, top_offset = 0, offset_parent, use_parent;
for (use_parent = parent_elem; use_parent; use_parent = use_parent.ownerDocument.defaultView.frameElement) {
offset_parent = use_parent;
do {
left_offset += offset_parent.offsetLeft - offset_parent.scrollLeft;
top_offset += offset_parent.offsetTop - offset_parent.scrollTop;
offset_parent = offset_parent.offsetParent;
/* Stop on body, because it sometimes have the same offset/scroll values as its iframe parent and sometimes not. */
} while (offset_parent && !(/* offset_parent instanceof HTMLBodyElement */ offset_parent.tagName == "BODY"));
}
elem = doc.elementFromPoint(xx - left_offset + window.scrollX, yy - top_offset + window.scrollY);
}
if (!elem) {
return parent_elem;
}
if (/* !(elem instanceof HTMLIFrameElement) */ elem.tagName != "IFRAME") {
return elem;
}
if (parent_elem && parent_elem === elem) {
return parent_elem;
}
var iframedoc = elem.contentDocument;
if (!iframedoc) {
return parent_elem;
}
return Evo.findElementFromPoint(iframedoc, xx, yy, elem);
}
Evo.GetElementFromPoint = function(xx, yy)
{
var elem;
if (xx == -1 && yy == -1)
elem = document.activeElement;
else
elem = Evo.findElementFromPoint(document, xx, yy, null);
if (!elem)
return null;
var res = [], iframe;
iframe = elem.ownerDocument.defaultView.frameElement;
res["iframe-src"] = iframe ? iframe.src : document.documentURI;
res["iframe-id"] = iframe ? iframe.id : "";
res["elem-id"] = elem.id;
return res;
}
Evo.AddTooltipToLinks = function(iframe_id)
{
var doc = Evo.findIFrameDocument(iframe_id);
if (!doc)
return;
var elements, ii;
elements = doc.getElementsByTagName("A");
for (ii = 0; ii < elements.length; ii++) {
var elem = elements[ii];
if (elem.href && !elem.title) {
var tooltip = Evo.getUriTooltip(elem.href);
if (tooltip)
elem.title = tooltip;
}
}
}
Evo.initialize = function(elem)
{
var doc, elems, ii;
if (elem && /*elem instanceof HTMLIFrameElement*/ elem.tagName == "IFRAME" && elem.contentDocument) {
elem.onload = function() { Evo.initializeAndPostContentLoaded(this); };
doc = elem.contentDocument;
} else
doc = document;
Evo.setupPlugins(doc);
elems = doc.getElementsByTagName("iframe");
for (ii = 0; ii < elems.length; ii++) {
var iframe = elems[ii];
iframe.onload = function() { Evo.initializeAndPostContentLoaded(this); };
if (iframe.contentDocument && iframe.contentDocument.body && iframe.contentDocument.body.childElementCount > 0)
Evo.initializeAndPostContentLoaded(iframe);
else if (iframe.contentDocument && iframe.contentDocument.body)
iframe.contentDocument.body.onload = function() { Evo.initializeAndPostContentLoaded(this); };
}
/* Ensure selection, used for the caret mode */
if (!doc.getSelection().anchorNode && doc.body.firstChild) {
if (doc.body) {
doc.getSelection().setPosition(doc.body.firstChild, 0);
}
if (doc.defaultView && !doc.defaultView.frameElement) {
var iframe = doc.getElementsByTagName('IFRAME')[0];
if (iframe && iframe.contentDocument && iframe.contentDocument.body && iframe.contentDocument.body.firstChild) {
iframe.focus();
iframe.contentDocument.getSelection().setPosition(iframe.contentDocument.body.firstChild, 0);
}
}
}
if (doc.defaultView && !doc.defaultView.frameElement && !doc.body.hasAttribute("class"))
doc.body.className = "-e-web-view-background-color -e-web-view-text-color";
elems = doc.querySelectorAll("input, textarea, select, button, label");
for (ii = 0; ii < elems.length; ii++) {
elems[ii].onfocus = function() { window.webkit.messageHandlers.needInputChanged.postMessage(true); };
elems[ii].onblur = function() { window.webkit.messageHandlers.needInputChanged.postMessage(false); };
}
elems = doc.querySelectorAll("img[src^=\"file://\"]");
for (ii = 0; ii < elems.length; ii++) {
elems[ii].src = "evo-" + elems[ii].src;
}
if (doc.body && doc.querySelector("[data-evo-signature-plain-text-mode]")) {
doc.body.setAttribute("style", "font-family: Monospace;");
}
doc.onselectionchange = Evo.selectionChanged;
}
Evo.initializeAndPostContentLoaded = function(elem)
{
var iframe_id = "";
if (elem && /*elem instanceof HTMLIFrameElement*/ elem.tagName == "IFRAME")
iframe_id = elem.id;
if (elem && elem.ownerDocument && elem.ownerDocument.defaultView.frameElement)
iframe_id = elem.ownerDocument.defaultView.frameElement.id;
else if (window.frameElement)
iframe_id = window.frameElement.id;
Evo.initialize(elem);
/* Skip, when its content is not loaded yet */
if (iframe_id != "" && elem && elem.tagName == "IFRAME" && elem.contentDocument &&
(!elem.contentDocument.body || !elem.contentDocument.body.childElementCount)) {
if (elem.contentDocument.body) {
elem.contentDocument.body.onload = function() { Evo.initializeAndPostContentLoaded(this); };
}
} else {
window.webkit.messageHandlers.contentLoaded.postMessage(iframe_id);
}
if (window.webkit.messageHandlers.mailDisplayMagicSpacebarStateChanged)
Evo.mailDisplayUpdateMagicSpacebarState();
Evo.AddTooltipToLinks(iframe_id);
var traversar = {
exec : function(doc, ifrm_id, level) {
if (doc.body && doc.body.firstElementChild) {
window.webkit.messageHandlers.contentLoaded.postMessage(ifrm_id);
}
return true;
}
};
Evo.foreachIFrameDocument(document, traversar, false, 0);
}
Evo.EnsureMainDocumentInitialized = function()
{
Evo.initializeAndPostContentLoaded(null);
}
Evo.mailDisplayGetScrollbarHeight = function()
{
if (Evo.mailDisplayCachedScrollbarHeight != undefined)
return Evo.mailDisplayCachedScrollbarHeight;
var el = document.createElement("div");
el.style.cssText = "overflow:scroll; visibility:hidden; position:absolute;";
document.body.appendChild(el);
Evo.mailDisplayCachedScrollbarHeight = el.offsetHeight - el.clientHeight
el.remove();
return Evo.mailDisplayCachedScrollbarHeight;
}
Evo.mailDisplayUpdateIFramesHeightRecursive = function(doc)
{
if (!doc)
return;
var ii, iframes;
iframes = doc.getElementsByTagName("iframe");
/* Update from bottom to top */
for (ii = 0; ii < iframes.length; ii++) {
Evo.mailDisplayUpdateIFramesHeightRecursive(iframes[ii].contentDocument);
}
if (!doc.scrollingElement || !doc.defaultView || !doc.defaultView.frameElement)
return;
if (doc.defaultView.frameElement.height == doc.scrollingElement.scrollHeight)
doc.defaultView.frameElement.height = 10;
doc.defaultView.frameElement.height = doc.scrollingElement.scrollHeight + 2 +
(doc.scrollingElement.scrollWidth > doc.scrollingElement.clientWidth ? Evo.mailDisplayGetScrollbarHeight() : 0);
}
Evo.mailDisplayUpdateIFramesHeightCB = function(timeStamp)
{
if (Evo.mailDisplayRecalcHeightTimeStamp === timeStamp)
return;
Evo.mailDisplayRecalcHeightTimeStamp = timeStamp;
var scrollx = document.defaultView ? document.defaultView.scrollX : -1;
var scrolly = document.defaultView ? document.defaultView.scrollY : -1;
Evo.mailDisplayUpdateIFramesHeightRecursive(document);
if (scrollx != -1 && scrolly != -1 && (
document.defaultView.scrollX != scrollx ||
document.defaultView.scrollY != scrolly))
document.defaultView.scrollTo(scrollx, scrolly);
Evo.mailDisplayResizeContentToPreviewWidth();
Evo.mailDisplayUpdateMagicSpacebarState();
}
Evo.MailDisplayUpdateIFramesHeight = function()
{
window.requestAnimationFrame(Evo.mailDisplayUpdateIFramesHeightCB);
}
if (this instanceof Window && this.document) {
this.document.onload = function() { Evo.initializeAndPostContentLoaded(this); };
if (this.document.body && this.document.body.firstChild)
Evo.initializeAndPostContentLoaded(this.document);
}
Evo.replaceImgSource = function(src, requireFirst, first, second)
{
if (requireFirst)
return src.replace(second, first);
return src.replace(first, second);
}
Evo.vCardCollapseContactList = function(elem)
{
if (elem && elem.id && elem.id != "" && elem.ownerDocument) {
var list;
list = elem.ownerDocument.getElementById("list-" + elem.id);
if (list) {
var child;
list.hidden = !list.hidden;
for (child = elem.firstElementChild; child; child = child.nextElementSibling) {
if (/*child instanceof HTMLImageElement*/ child.tagName == "IMG") {
child.src = Evo.replaceImgSource(child.src, list.hidden,
"gtk-stock://x-evolution-pan-end", "gtk-stock://x-evolution-pan-down");
}
}
}
}
}
Evo.vCardBindInDocument = function(doc)
{
if (!doc)
return;
var elems, ii;
elems = doc.querySelectorAll("._evo_vcard_collapse_button");
for (ii = 0; ii < elems.length; ii++) {
elems[ii].onclick = function() { Evo.vCardCollapseContactList(this); };
}
}
Evo.VCardBind = function(iframe_id)
{
var traversar = {
exec : function(doc, iframe_id, level) {
Evo.vCardBindInDocument(doc);
}
};
Evo.runTraversarForIFrameId(iframe_id, traversar);
}
Evo.mailDisplayResizeContentToPreviewWidthCB = function(timeStamp)
{
if (Evo.mailDisplayPreviewWidthTimeStamp === timeStamp)
return;
Evo.mailDisplayPreviewWidthTimeStamp = timeStamp;
if (!document || !document.documentElement ||
document.documentElement.scrollWidth < document.documentElement.clientWidth) {
return;
}
var traversar = {
can_force_width_on_iframe : function(iframe) {
if (!iframe || !iframe.contentDocument)
return false;
/* We can force the width on every message that was not formatted
* by text-highlight module. */
if (iframe.id.indexOf("text-highlight") < 0)
return true;
/* If the message was formatted with text-highlight we can adjust the
* width just for the messages that were formatted as plain text. */
return iframe.src.indexOf("__formatas=txt") >= 0;
},
set_iframe_and_body_width : function(doc, width, original_width, level) {
if (!doc)
return;
var ii, iframes, local_width = width;
iframes = doc.getElementsByTagName("iframe");
if (level == 0) {
local_width -= 2; /* 1 + 1 frame borders */
} else if (!iframes.length) {
/* Message main body */
local_width -= level * 20; /* 10 + 10 margins of body without iframes */
local_width -= 4;
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", "body", "width: " + local_width + "px;");
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", ".part-container", "width: " + local_width + "px;");
} else if (level == 1) {
local_width -= 20; /* 10 + 10 margins of body with iframes */
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", "body",
"width: " + local_width + "px;");
local_width -= 4; /* 2 + 2 frame borders */
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", ".part-container-nostyle iframe",
"width: " + local_width + "px;");
/* We need to subtract another 10 pixels from the iframe width to
* have the iframe's borders on the correct place. We can't subtract
* it from local_width as we don't want to propagate this change
* further. */
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", ".part-container iframe",
"width: " + (local_width - 10) + "px;");
} else {
local_width -= (level - 1) * 20; /* 10 + 10 margins of body with iframes */
local_width -= 4; /* 2 + 2 frame borders */
local_width -= 10; /* attachment margin */
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", ".part-container-nostyle iframe",
"width: " + local_width + "px;");
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", "body > .part-container-nostyle iframe",
"width: " + local_width + "px;");
}
/* Add rules to every sub document */
for (ii = 0; ii < iframes.length; ii++) {
var jj, frmdoc = iframes[ii].contentDocument;
for (jj = 0; frmdoc && jj < frmdoc.images.length; jj++) {
var img = frmdoc.images[jj];
if (frmdoc.defaultView && !img.hasAttribute("width") && !img.hasAttribute("height")) {
var can1 = img.hasAttribute("x-evo-width-modified"), can2 = false;
if (!can1)
can2 = img.style.width == "" && img.style.height == "";
if (can1 || can2) {
var expected_width;
if (can1) {
expected_width = parseInt(img.getAttribute("x-evo-width-modified"));
} else {
var tmp = frmdoc.defaultView.getComputedStyle(img).width;
if (tmp && tmp.endsWith("px"))
expected_width = parseInt(tmp.slice(0, -2));
else
expected_width = tmp;
img.setAttribute("x-evo-width-modified", expected_width);
}
if (expected_width < local_width)
img.style.width = expected_width + "px";
else
img.style.width = local_width + "px";
}
}
}
if (!this.can_force_width_on_iframe (iframes[ii]))
continue;
var tmp_local_width = local_width;
if (level == 0) {
tmp_local_width -= 10; /* attachment's margin */
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", ".attachment-wrapper iframe:not([src*=\"__formatas=\"])",
"width: " + tmp_local_width + "px;");
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", ".attachment-wrapper iframe[src*=\"__formatas=txt\"]",
"width: " + tmp_local_width + "px;");
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", "body > .part-container-nostyle iframe",
"width: " + tmp_local_width + "px;");
}
this.set_iframe_and_body_width (iframes[ii].contentDocument, tmp_local_width, original_width, level + 1);
}
}
};
var width = document.documentElement.clientWidth;
width -= 20; /* 10 + 10 margins of body */
traversar.set_iframe_and_body_width(document, width, width, 0);
if (document.documentElement.clientWidth - 20 > width)
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
Evo.mailDisplayResizeContentToPreviewWidth = function()
{
window.requestAnimationFrame(Evo.mailDisplayResizeContentToPreviewWidthCB);
}
Evo.mailDisplayUpdateMagicSpacebarState = function()
{
var new_state = 0;
if (document && document.defaultView && document.documentElement && document.documentElement.scrollHeight) {
if (document.defaultView.scrollY + document.defaultView.innerHeight < document.documentElement.scrollHeight)
new_state |= (1 << 0); /* E_MAGIC_SPACEBAR_CAN_GO_BOTTOM */
if (document.defaultView.scrollY > 0)
new_state |= (1 << 1); /* E_MAGIC_SPACEBAR_CAN_GO_TOP */
}
if (new_state != Evo.magicSpacebarState) {
Evo.magicSpacebarState = new_state;
window.webkit.messageHandlers.mailDisplayMagicSpacebarStateChanged.postMessage(Evo.magicSpacebarState);
}
}
Evo.mailDisplayResized = function()
{
Evo.mailDisplayResizeContentToPreviewWidth();
Evo.mailDisplayUpdateMagicSpacebarState();
}
Evo.mailDisplayToggleHeadersVisibility = function(elem)
{
if (!elem || !elem.ownerDocument)
return;
var short_headers, full_headers;
short_headers = elem.ownerDocument.getElementById("__evo-short-headers");
full_headers = elem.ownerDocument.getElementById("__evo-full-headers");
if (!short_headers || !full_headers)
return;
var expanded = full_headers.style.getPropertyValue("display") == "table";
full_headers.style.setProperty("display", expanded ? "none" : "table");
short_headers.style.setProperty("display", expanded ? "table" : "none");
var child;
for (child = elem.firstElementChild; child; child = child.nextElementSibling) {
if (/*child instanceof HTMLImageElement*/ child.tagName == "IMG")
child.src = Evo.replaceImgSource(child.src, expanded,
"gtk-stock://x-evolution-pan-end", "gtk-stock://x-evolution-pan-down");
}
window.webkit.messageHandlers.mailDisplayHeadersCollapsed.postMessage(expanded);
}
Evo.mailDisplayToggleAddressVisibility = function(elem)
{
if (!elem || !elem.ownerDocument)
return;
var parent, img;
/* get img and parent depending on which element the click came from (button/ellipsis) */
if (/* elem instanceof HTMLButtonElement */ elem.tagName == "BUTTON") {
parent = elem.parentElement.parentElement;
img = elem.firstElementChild;
} else {
var button;
parent = elem.parentElement;
button = parent.parentElement.querySelector("#__evo-moreaddr-button");
img = button.firstElementChild;
}
var full_addr, ellipsis;
full_addr = parent.querySelector("#__evo-moreaddr");
ellipsis = parent.querySelector("#__evo-moreaddr-ellipsis");
if (full_addr && ellipsis) {
var expanded;
expanded = full_addr.style.getPropertyValue("display") == "inline";
full_addr.style.setProperty("display", expanded ? "none" : "inline");
ellipsis.style.setProperty("display", expanded ? "inline" : "none");
img.src = Evo.replaceImgSource(img.src, expanded,
"gtk-stock://x-evolution-pan-end", "gtk-stock://x-evolution-pan-down");
}
}
Evo.mailDisplayVCardModeButtonClicked = function(elem)
{
if (!elem || !elem.parentElement)
return;
var normal_btn = null, compact_btn = null, iframe_elem = null, child;
for (child = elem.parentElement.firstElementChild; child; child = child.nextElementSibling) {
if (!iframe_elem && /* child instanceof HTMLImageElement */ child.tagName == "IFRAME") {
iframe_elem = child;
if (normal_btn && compact_btn)
break;
continue;
}
var name = child.getAttribute("name");
if (name) {
if (!normal_btn && name == "set-display-mode-normal")
normal_btn = child;
else if (!compact_btn && name == "set-display-mode-compact")
compact_btn = child;
if (normal_btn && compact_btn && iframe_elem)
break;
}
}
if (normal_btn && compact_btn && iframe_elem) {
normal_btn.hidden = normal_btn === elem;
compact_btn.hidden = !normal_btn.hidden;
iframe_elem.src = elem.getAttribute("evo-iframe-uri");
}
}
Evo.unsetHTMLColors = function(doc)
{
var ii, isz = doc.styleSheets.length;
// to change only iframe-s, which are marked as such
if (!doc.defaultView.frameElement ||
!doc.defaultView.frameElement.hasAttribute("x-e-unset-colors")) {
return;
}
for (ii = 0; ii < isz; ii++) {
var sheet = doc.styleSheets[ii];
if (!sheet.cssRules ||
sheet.id == "-e-web-view-style-sheet" ||
sheet.id == "-e-mail-formatter-style-sheet") {
continue;
}
var jj, jsz = sheet.cssRules.length;
for (jj = 0; jj < jsz; jj++) {
var rule = sheet.cssRules[jj];
if (!rule.style || !rule.selectorText || rule.selectorText.startsWith(".-e-web-view-") || rule.selectorText.startsWith(".-e-mail-formatter-"))
continue;
if (rule.style.color)
rule.style.removeProperty("color");
if (rule.style.backgroundColor)
rule.style.removeProperty("background-color");
}
}
var elems = doc.querySelectorAll("[style],[color],[bgcolor]");
isz = elems.length;
for (ii = 0; ii < isz; ii++) {
var elem = elems[ii];
if (elem.tagName != "HTML" && elem.tagName != "IFRAME" && elem.tagName != "INPUT" && elem.tagName != "BUTTON" && elem.tagName != "IMG") {
if (elem.style) {
if (elem.style.color)
elem.style.removeProperty("color");
if (elem.style.backgroundColor)
elem.style.removeProperty("background-color");
if (!elem.style.length)
elem.removeAttribute("style");
}
elem.removeAttribute("color");
elem.removeAttribute("bgcolor");
}
}
elems = doc.querySelectorAll("body");
isz = elems.length;
for (ii = 0; ii < isz; ii++) {
var elem = elems[ii];
elem.removeAttribute("bgcolor");
elem.removeAttribute("text");
elem.removeAttribute("link");
elem.removeAttribute("alink");
elem.removeAttribute("vlink");
if (!elem.classList.contains("-e-web-view-text-color"))
elem.classList.add("-e-web-view-text-color");
if (!elem.classList.contains("-e-web-view-background-color"))
elem.classList.add("-e-web-view-background-color");
}
}
Evo.mailDisplaySetIFrameHeightForDocument = function(doc, minHeight)
{
if (!doc || !doc.defaultView || !doc.scrollingElement)
return;
var iframe = doc.defaultView.frameElement;
if (!iframe)
return;
var value = minHeight;
iframe.height = 10;
if (value < doc.scrollingElement.scrollHeight)
value = doc.scrollingElement.scrollHeight;
if (doc.scrollingElement.scrollWidth > doc.scrollingElement.clientWidth)
value += Evo.mailDisplayGetScrollbarHeight();
// to ignore size change notifications made by itself
if (Evo.mailDisplayResizeObserver)
Evo.mailDisplayResizeObserver.expectChange++;
iframe.height = value;
// update also parent
if (iframe.ownerDocument && iframe.ownerDocument.defaultView && iframe.ownerDocument.defaultView.frameElement)
Evo.mailDisplaySetIFrameHeightForDocument(iframe.ownerDocument, 10);
}
Evo.mailDisplayHandleSizeEntries = function(timeStamp)
{
if (!Evo.mailDisplaySizeEntries || !Evo.mailDisplaySizeEntries.length)
return;
var scrollx = document.defaultView ? document.defaultView.scrollX : -1;
var scrolly = document.defaultView ? document.defaultView.scrollY : -1;
var covered = [], ii;
for (ii = Evo.mailDisplaySizeEntries.length - 1; ii >= 0; ii--) {
var entries = Evo.mailDisplaySizeEntries[ii];
for (const entry of entries) {
if (covered.includes(entry.target))
continue;
covered[covered.length] = entry.target;
if (entry.target.ownerDocument && entry.target.ownerDocument.defaultView &&
entry.target.ownerDocument.defaultView.frameElement && entry.borderBoxSize?.length > 0) {
Evo.mailDisplaySetIFrameHeightForDocument(entry.target.ownerDocument, entry.borderBoxSize[0].blockSize);
}
}
if (scrollx != -1 && scrolly != -1 && (
document.defaultView.scrollX != scrollx ||
document.defaultView.scrollY != scrolly))
document.defaultView.scrollTo(scrollx, scrolly);
}
Evo.mailDisplaySizeEntries = [];
}
Evo.mailDisplaySizeChanged = function(entries, observer)
{
if (Evo.mailDisplaySizeEntries === undefined) {
Evo.mailDisplaySizeEntries = [];
}
Evo.mailDisplaySizeEntries[Evo.mailDisplaySizeEntries.length] = entries;
if (Evo.mailDisplayResizeObserver.expectChange > 0) {
Evo.mailDisplayResizeObserver.expectChange--;
return;
}
window.requestAnimationFrame(Evo.mailDisplayHandleSizeEntries);
}
Evo.MailDisplayBindDOM = function(iframe_id, markCitationColor)
{
Evo.markCitationColor = markCitationColor != "" ? markCitationColor : null;
if (!Evo.mailDisplayResizeObserver) {
Evo.mailDisplayResizeObserver = new ResizeObserver(Evo.mailDisplaySizeChanged);
Evo.mailDisplayResizeObserver.expectChange = 0;
}
var traversar = {
unstyleBlockquotes : function(doc) {
var ii, elems;
elems = doc.getElementsByTagName("blockquote");
for (ii = 0; ii < elems.length; ii++) {
var elem = elems[ii];
if (elem.hasAttribute("type")) {
if (elem.getAttribute("type").toLowerCase() == "cite")
elem.removeAttribute("style");
} else {
elem.removeAttribute("style");
elem.setAttribute("type", "cite");
}
if (elem.hasAttribute("style") &&
elem.getAttribute("style") == Evo.blockquoteStyle) {
elem.removeAttribute("style");
}
if (Evo.markCitationColor && elem.hasAttribute("type") && elem.getAttribute("type").toLowerCase() == "cite")
elem.style.color = Evo.markCitationColor;
}
},
textRequiresWrap : function(text) {
if (!text || text.length <= 80)
return false;
var cnt = -1, ii;
for (ii = 0; ii < text.length; ii++) {
cnt++;
var chr = text.charAt(ii);
if (chr == ' ' || chr == '\t' || chr == '\r' || chr == '\n')
cnt == -1;
else if (cnt > 80)
return true;
}
return false;
},
wrapLongAchors : function(doc) {
var ii, elems;
elems = doc.getElementsByTagName("blockquote");
for (ii = 0; ii < elems.length; ii++) {
var elem = elems[ii];
if (this.textRequiresWrap(elem.innerText))
elem.classList.add("evo-awrap");
else
elem.classList.remove("evo-awrap");
}
},
bind : function(doc) {
var ii, elems;
elems = doc.querySelectorAll("#__evo-collapse-headers-img");
for (ii = 0; ii < elems.length; ii++) {
elems[ii].onclick = function() { Evo.mailDisplayToggleHeadersVisibility(this); };
}
elems = doc.querySelectorAll("#__evo-moreaddr-ellipsis");
for (ii = 0; ii < elems.length; ii++) {
elems[ii].onclick = function() { Evo.mailDisplayToggleAddressVisibility(this); };
}
elems = doc.querySelectorAll("#__evo-moreaddr-button");
for (ii = 0; ii < elems.length; ii++) {
elems[ii].onclick = function() { Evo.mailDisplayToggleAddressVisibility(this); };
}
elems = doc.querySelectorAll(".org-gnome-vcard-display-mode-button");
for (ii = 0; ii < elems.length; ii++) {
elems[ii].onclick = function() { Evo.mailDisplayVCardModeButtonClicked(this); };
}
var elem;
elem = doc.getElementById("__evo-contact-photo");
if (elem && elem.hasAttribute("data-mailaddr")) {
var mail_addr;
mail_addr = elem.getAttribute("data-mailaddr");
if (mail_addr != "") {
elem.src = "mail://contact-photo?mailaddr=" + mail_addr;
}
}
},
exec : function(doc, iframe_id, level) {
if (doc) {
this.unstyleBlockquotes(doc);
this.wrapLongAchors(doc);
this.bind(doc);
Evo.vCardBindInDocument(doc);
Evo.addRuleIntoStyleSheetDocument(doc,
"-e-mail-formatter-style-sheet",
"a.evo-awrap",
"white-space: normal; word-break: break-all;");
Evo.unsetHTMLColors(doc);
if (doc.body) {
Evo.mailDisplayResizeObserver.observe(doc.body);
doc.body.onresize = Evo.mailDisplayResized;
}
}
return true;
}
};
if (!iframe_id)
iframe_id = "*";
Evo.runTraversarForIFrameId(iframe_id, traversar);
Evo.mailDisplayResizeContentToPreviewWidth();
Evo.mailDisplayUpdateMagicSpacebarState();
if (document.body) {
Evo.mailDisplayResizeObserver.observe(document.body);
document.body.onresize = Evo.mailDisplayResized;
document.body.onscroll = Evo.mailDisplayUpdateMagicSpacebarState;
}
}
Evo.MailDisplayShowAttachment = function(element_id, show)
{
var elem;
elem = Evo.FindElement("*", element_id);
if (!elem) {
return;
}
elem.hidden = !show;
if (elem.hasAttribute("inner-html-data")) {
var html_data = elem.getAttribute("inner-html-data");
elem.removeAttribute("inner-html-data");
if (html_data && html_data != "") {
elem.innerHTML = html_data;
var iframe;
iframe = elem.querySelector("iframe");
if (iframe) {
Evo.initializeAndPostContentLoaded(iframe);
Evo.MailDisplayBindDOM(iframe.id, Evo.markCitationColor);
}
var iframe_id = "";
if (elem.ownerDocument.defaultView.frameElement)
iframe_id = elem.ownerDocument.defaultView.frameElement.id;
window.webkit.messageHandlers.contentLoaded.postMessage(iframe_id);
Evo.mailDisplayUpdateMagicSpacebarState();
}
} else if (elem.ownerDocument.defaultView.frameElement) {
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
Evo.MailDisplayProcessMagicSpacebar = function(towards_bottom)
{
if (document && document.defaultView && document.defaultView.innerHeight) {
document.defaultView.scrollBy(0, (towards_bottom ? 1 : -1) * document.defaultView.innerHeight);
}
Evo.mailDisplayUpdateMagicSpacebarState();
}
Evo.MailDisplayManageInsecureParts = function(iframe_id, part_id_prefix, show, partids)
{
var ii, elem;
elem = Evo.FindElement(iframe_id, "show:" + part_id_prefix);
if (elem) {
elem.hidden = show
}
elem = Evo.FindElement(iframe_id, "hide:" + part_id_prefix);
if (elem) {
elem.hidden = !show
}
for (ii = 0; ii < partids.length; ii++) {
elem = Evo.FindElement(iframe_id, partids[ii]);
if (elem)
elem.hidden = !show;
}
}
var EvoItip = {
SELECT_ESOURCE : "select_esource",
TEXTAREA_RSVP_COMMENT : "textarea_rsvp_comment",
CHECKBOX_RSVP : "checkbox_rsvp",
CHECKBOX_RECUR : "checkbox_recur",
CHECKBOX_KEEP_ALARM : "checkbox_keep_alarm",
CHECKBOX_INHERIT_ALARM : "checkbox_inherit_alarm",
CHECKBOX_UPDATE : "checkbox_update",
CHECKBOX_FREE_TIME : "checkbox_free_time",
TABLE_ROW_BUTTONS : "table_row_buttons"
};
EvoItip.alarmCheckClickedCb = function(check1)
{
var check2;
if (check1.id == EvoItip.CHECKBOX_KEEP_ALARM) {
check2 = check1.ownerDocument.getElementById(EvoItip.CHECKBOX_INHERIT_ALARM);
} else {
check2 = check1.ownerDocument.getElementById(EvoItip.CHECKBOX_KEEP_ALARM);
}
if (check2) {
check2.disabled = check1.hidden && check1.checked;
}
}
EvoItip.selectedSourceChanged = function(elem)
{
var data = {};
data["iframe-id"] = elem.ownerDocument.defaultView.frameElement.id;
data["source-uid"] = elem.value;
window.webkit.messageHandlers.itipSourceChanged.postMessage(data);
}
EvoItip.Initialize = function(iframe_id)
{
var doc = Evo.findIFrameDocument(iframe_id);
if (!doc) {
return;
}
var elem;
elem = doc.getElementById(EvoItip.SELECT_ESOURCE);
if (elem) {
elem.onchange = function() { EvoItip.selectedSourceChanged(this); };
}
elem = doc.getElementById(EvoItip.CHECKBOX_RECUR);
if (elem) {
elem.onclick = function() { window.webkit.messageHandlers.itipRecurToggled.postMessage(this.ownerDocument.defaultView.frameElement.id); };
}
elem = doc.getElementById(EvoItip.CHECKBOX_RSVP);
if (elem) {
elem.onclick = function() {
var elem = this.ownerDocument.getElementById(EvoItip.TEXTAREA_RSVP_COMMENT);
if (elem) {
elem.disabled = !this.checked;
}
};
}
elem = doc.getElementById(EvoItip.CHECKBOX_INHERIT_ALARM);
if (elem) {
elem.onclick = function() { EvoItip.alarmCheckClickedCb(this); };
}
elem = doc.getElementById(EvoItip.CHECKBOX_KEEP_ALARM);
if (elem) {
elem.onclick = function() { EvoItip.alarmCheckClickedCb(this); };
}
}
EvoItip.SetElementInnerHTML = function(iframe_id, element_id, html_content)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
elem.innerHTML = html_content;
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
EvoItip.SetShowCheckbox = function(iframe_id, element_id, show, update_second)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
elem.hidden = !show;
if (elem.nextElementSibling) {
elem.nextElementSibling.hidden = !show;
}
if (!show) {
elem.checked = false;
}
if (update_second) {
EvoItip.alarmCheckClickedCb(elem);
}
elem = elem.ownerDocument.getElementById("table_row_" + element_id);
if (elem) {
elem.hidden = !show;
}
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
EvoItip.SetAreaText = function(iframe_id, element_id, text)
{
var row = Evo.FindElement(iframe_id, element_id);
if (row) {
row.hidden = text == "";
if (row.lastElementChild) {
row.lastElementChild.innerHTML = text;
}
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
EvoItip.UpdateTimes = function(iframe_id, element_id, header, label)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
elem.hidden = false;
if (elem.firstElementChild) {
elem.firstElementChild.innerHTML = header;
}
if (elem.lastElementChild) {
elem.lastElementChild.innerHTML = label;
}
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
EvoItip.AppendInfoRow = function(iframe_id, table_id, row_id, icon_name, message)
{
var cell, row, table = Evo.FindElement(iframe_id, table_id);
if (!table) {
return;
}
row = table.insertRow(-1);
row.id = row_id;
cell = row.insertCell(-1);
if (icon_name && icon_name != "") {
var img;
img = table.ownerDocument.createElement("img");
img.src = "gtk-stock://" + icon_name;
cell.appendChild(img);
}
cell = row.insertCell(-1);
cell.innerHTML = message;
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
EvoItip.RemoveInfoRow = function(iframe_id, row_id)
{
var row = Evo.FindElement(iframe_id, row_id);
if (row && row.parentNode) {
row.parentNode.removeChild(row);
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
EvoItip.RemoveChildNodes = function(iframe_id, element_id)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
while (elem.lastChild) {
elem.removeChild(elem.lastChild);
}
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
EvoItip.AddToSourceList = function(iframe_id, optgroup_id, optgroup_label, option_id, option_label, writable)
{
var doc, select_elem;
doc = Evo.findIFrameDocument(iframe_id);
select_elem = doc ? doc.getElementById(EvoItip.SELECT_ESOURCE) : null;
if (!select_elem) {
return;
}
var option, optgroup;
optgroup = doc.getElementById (optgroup_id);
if (!optgroup) {
optgroup = doc.createElement("optgroup");
optgroup.id = optgroup_id;
optgroup.label = optgroup_label;
select_elem.appendChild(optgroup);
}
option = doc.createElement("option");
option.value = option_id;
option.label = option_label;
option.innerHTML = option_label;
option.className = "calendar";
if (!writable) {
option.disabled = true;
}
optgroup.appendChild(option);
}
EvoItip.HideButtons = function(iframe_id, element_id)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
var child;
for (child = elem.firstElementChild; child; child = child.nextElementSibling) {
var button = child.firstElementChild;
if (button)
button.hidden = true;
}
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}
}
EvoItip.SetElementAccessKey = function(iframe_id, element_id, access_key)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
elem.accessKey = access_key;
}
}
EvoItip.SetSelectSelected = function(iframe_id, element_id, option_value)
{
var elem = Evo.FindElement(iframe_id, element_id);
if (elem) {
var ii;
for (ii = 0; ii < elem.length; ii++) {
if (elem.item(ii).value == option_value) {
elem.item(ii).selected = true;
break;
}
}
// claim what source is selected when failed to select the requested source
if (ii >= elem.length)
EvoItip.selectedSourceChanged(elem);
}
}
EvoItip.SetButtonsDisabled = function(iframe_id, disabled)
{
var doc = Evo.findIFrameDocument(iframe_id);
if (!doc) {
return;
}
var elem, cell;
elem = doc.getElementById(EvoItip.CHECKBOX_UPDATE);
if (elem)
elem.disabled = disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_RECUR);
if (elem)
elem.disabled = disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_FREE_TIME);
if (elem)
elem.disabled = disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_KEEP_ALARM);
if (elem)
elem.disabled = disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_INHERIT_ALARM);
if (elem)
elem.disabled = disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_RSVP);
if (elem)
elem.disabled = disabled;
elem = doc.getElementById(EvoItip.TEXTAREA_RSVP_COMMENT);
if (elem)
elem.disabled = disabled;
elem = doc.getElementById(EvoItip.TABLE_ROW_BUTTONS);
if (!elem)
return;
for (cell = elem.firstElementChild; cell; cell = cell.nextElementSibling) {
var btn = cell.firstElementChild;
if (btn && !btn.hidden) {
btn.disabled = disabled;
}
}
}
EvoItip.GetState = function(iframe_id)
{
var doc;
doc = Evo.findIFrameDocument(iframe_id);
if (!doc) {
return null;
}
var elem, res = {};
elem = doc.getElementById(EvoItip.TEXTAREA_RSVP_COMMENT);
res["rsvp-comment"] = elem ? elem.value : null;
elem = doc.getElementById(EvoItip.CHECKBOX_RSVP);
res["rsvp-check"] = elem && elem.checked && !elem.hidden && !elem.disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_UPDATE);
res["update-check"] = elem && elem.checked && !elem.hidden && !elem.disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_RECUR);
res["recur-check"] = elem && elem.checked && !elem.hidden && !elem.disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_FREE_TIME);
res["free-time-check"] = elem && elem.checked && !elem.hidden && !elem.disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_KEEP_ALARM);
res["keep-alarm-check"] = elem && elem.checked && !elem.hidden && !elem.disabled;
elem = doc.getElementById(EvoItip.CHECKBOX_INHERIT_ALARM);
res["inherit-alarm-check"] = elem && elem.checked && !elem.hidden && !elem.disabled;
return res;
}
EvoItip.FlipAlternativeHTMLPart = function(iframe_id, element_value, img_id, span_id)
{
var elem = Evo.FindElement(iframe_id, element_value);
if (elem) {
elem.hidden = !elem.hidden;
}
elem = Evo.FindElement(iframe_id, img_id);
if (elem) {
var tmp = elem.src;
elem.src = elem.getAttribute("othersrc");
elem.setAttribute("othersrc", tmp);
}
elem = Evo.FindElement(iframe_id, img_id + "-dark");
if (elem) {
var tmp = elem.src;
elem.src = elem.getAttribute("othersrc");
elem.setAttribute("othersrc", tmp);
}
elem = Evo.FindElement(iframe_id, span_id);
if (elem) {
var tmp = elem.innerText;
elem.innerText = elem.getAttribute("othertext");
elem.setAttribute("othertext", tmp);
}
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
}