1525 lines
38 KiB
JavaScript
1525 lines
38 KiB
JavaScript
'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
|
|
};
|
|
|
|
/* 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 (!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 = EvoConvertToPlainText(node);
|
|
} else if (format == 2) {
|
|
data = useOuterHTML ? node.outerHTML : node.innerHTML;
|
|
} else if (format == 3) {
|
|
data = {};
|
|
data["plain"] = EvoConvertToPlainText(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.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;
|
|
|
|
elems = doc.getElementsByTagName("iframe");
|
|
|
|
for (ii = 0; ii < elems.length; ii++) {
|
|
elems[ii].onload = function() { Evo.initializeAndPostContentLoaded(this); };
|
|
|
|
if (elems[ii].contentDocument.body && elems[ii].contentDocument.body.childElementCount > 0)
|
|
Evo.initializeAndPostContentLoaded(elems[ii]);
|
|
}
|
|
|
|
if (doc.defaultView && !doc.defaultView.frameElement && !doc.body.hasAttribute("class"))
|
|
doc.body.className = "-e-web-view-background-color -e-web-view-text-color";
|
|
|
|
if (doc.documentElement.style.getPropertyValue("color") == "" ||
|
|
doc.documentElement.style.getPropertyValue("color") == "text") {
|
|
doc.documentElement.style.setProperty("color", "inherit");
|
|
doc.documentElement.style.setProperty("background-color", "inherit");
|
|
}
|
|
|
|
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);
|
|
window.webkit.messageHandlers.contentLoaded.postMessage(iframe_id);
|
|
|
|
if (window.webkit.messageHandlers.mailDisplayMagicSpacebarStateChanged)
|
|
Evo.mailDisplayUpdateMagicSpacebarState();
|
|
}
|
|
|
|
Evo.EnsureMainDocumentInitialized = function()
|
|
{
|
|
Evo.initializeAndPostContentLoaded(null);
|
|
}
|
|
|
|
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.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 = list.hidden ? "gtk-stock://pan-end-symbolic" : "gtk-stock://pan-down-symbolic";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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.mailDisplayResizeContentToPreviewWidth = function()
|
|
{
|
|
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 -= 8; /* 8 + 8 margins of body without iframes */
|
|
if (level > 1)
|
|
local_width -= 8;
|
|
|
|
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 -= 2; /* 1 + 1 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 -= 20; /* 10 + 10 margins of body with iframes */
|
|
local_width -= 8; /* attachment margin */
|
|
local_width -= 2; /* 1 + 1 frame borders */
|
|
|
|
/* 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-nostyle iframe",
|
|
"width: " + (local_width - 10) + "px;");
|
|
|
|
Evo.addRuleIntoStyleSheetDocument(doc, "-e-mail-formatter-style-sheet", "body > .part-container-nostyle iframe",
|
|
"width: " + (local_width - 10) + "px;");
|
|
}
|
|
|
|
/* Add rules to every sub document */
|
|
for (ii = 0; ii < iframes.length; ii++) {
|
|
if (!this.can_force_width_on_iframe (iframes[ii]))
|
|
continue;
|
|
|
|
var tmp_local_width = local_width;
|
|
|
|
if (level == 0) {
|
|
tmp_local_width -= 8; /* 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: " + 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);
|
|
}
|
|
|
|
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");
|
|
|
|
if (elem.firstElementChild && /* elem.firstElementChild instanceof HTMLImageElement */ elem.firstElementChild.tagName == "IMG") {
|
|
elem.firstElementChild.src = expanded ? "gtk-stock://pan-end-symbolic" : "gtk-stock://pan-down-symbolic";
|
|
}
|
|
|
|
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 = expanded ? "gtk-stock://pan-end-symbolic" : "gtk-stock://pan-down-symbolic";
|
|
}
|
|
}
|
|
|
|
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.color = "inherit";
|
|
|
|
if (rule.style.backgroundColor)
|
|
rule.style.backgroundColor = "inherit";
|
|
}
|
|
}
|
|
|
|
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.color = "inherit";
|
|
|
|
if (elem.style.backgroundColor)
|
|
elem.style.backgroundColor = "inherit";
|
|
}
|
|
|
|
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.MailDisplayBindDOM = function(iframe_id, markCitationColor)
|
|
{
|
|
Evo.markCitationColor = markCitationColor != "" ? markCitationColor : null;
|
|
|
|
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);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
};
|
|
|
|
if (!iframe_id)
|
|
iframe_id = "*";
|
|
|
|
Evo.runTraversarForIFrameId(iframe_id, traversar);
|
|
|
|
Evo.mailDisplayResizeContentToPreviewWidth();
|
|
Evo.mailDisplayUpdateMagicSpacebarState();
|
|
|
|
document.defaultView.onresize = Evo.mailDisplayResized;
|
|
document.defaultView.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();
|
|
}
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
EvoItip.RemoveInfoRow = function(iframe_id, row_id)
|
|
{
|
|
var row = Evo.FindElement(iframe_id, row_id);
|
|
|
|
if (row && row.parentNode) {
|
|
row.parentNode.removeChild(row);
|
|
}
|
|
}
|
|
|
|
EvoItip.RemoveChildNodes = function(iframe_id, element_id)
|
|
{
|
|
var elem = Evo.FindElement(iframe_id, element_id);
|
|
|
|
if (elem) {
|
|
while (elem.lastChild) {
|
|
elem.removeChild(elem.lastChild);
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|