sogo/UI/WebServerResources/HTMLElement.js

384 lines
13 KiB
JavaScript

/* -*- Mode: js-mode; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
["HTMLCollection", "NodeList"].each(
function (className) {
if (className in window) {
var contClass = window[className];
var _each = contClass.prototype.forEach;
if (!_each) {
_each = function HTMLElement_each(iterator, context) {
for (var i = 0, length = this.length >>> 0; i < length; i++) {
if (i in this) iterator.call(context, this[i], i, this);
}
};
}
contClass.prototype._each = _each;
Object.extend(contClass.prototype, Enumerable);
}
}
);
/* custom extensions to the DOM api */
Element.addMethods({
addInterface: function(element, objectInterface) {
element = $(element);
Object.extend(element, objectInterface);
if (element.bind)
element.bind();
},
allTextContent: function(element) {
var content = "";
for (var i = 0; i < element.childNodes.length; i++) {
var node = $(element.childNodes[i]);
if (node.nodeType == Node.TEXT_NODE) {
content += node.nodeValue;
}
else if (node.nodeType === Node.ELEMENT_NODE) {
content += Element.allTextContent(node);
}
}
return content;
},
childNodesWithTag: function(element, tagName) {
element = $(element);
var matchingNodes = new Array();
tagName = tagName.toUpperCase();
for (var i = 0; i < element.childNodes.length; i++) {
var childNode = $(element.childNodes[i]);
if (Object.isElement(childNode)
&& childNode.tagName
&& childNode.tagName.toUpperCase() == tagName)
matchingNodes.push(childNode);
}
return matchingNodes;
},
getParentWithTagName: function(element, tagName) {
element = $(element);
var currentElement = element;
tagName = tagName.toUpperCase();
currentElement = currentElement.parentNode;
while (currentElement
&& currentElement.tagName != tagName) {
currentElement = currentElement.parentNode;
}
return currentElement;
},
cascadeLeftOffset: function(element) {
element = $(element);
var currentElement = element;
var offset = 0;
while (currentElement) {
offset += currentElement.offsetLeft;
currentElement = $(currentElement).getParentWithTagName("div");
}
return offset;
},
cascadeTopOffset: function(element) {
element = $(element);
var currentElement = element;
var offset = 0;
var i = 0;
while (currentElement && currentElement.tagName) {
offset += currentElement.offsetTop;
currentElement = currentElement.parentNode;
i++;
}
return offset;
},
dump: function(element, additionalInfo, additionalKeys) {
element = $(element);
var id = element.getAttribute("id");
var nclass = element.getAttribute("class");
var str = element.tagName;
if (id)
str += "; id = " + id;
if (nclass)
str += "; class = " + nclass;
if (additionalInfo)
str += "; " + additionalInfo;
if (additionalKeys)
for (var i = 0; i < additionalKeys.length; i++) {
var value = element.readAttribute(additionalKeys[i]);
if (value)
str += "; " + additionalKeys[i] + " = " + value;
}
log (str);
},
getSelectedNodes: function(element) {
element = $(element);
if (!element.selectedElements)
element.selectedElements = new Array();
return element.selectedElements;
},
getSelectedNodesId: function(element) {
element = $(element);
var selArray = null;
if (element.selectedIds) {
selArray = element.selectedIds;
}
else {
selArray = [];
if (element.selectedElements) {
for (var i = 0; i < element.selectedElements.length; i++) {
var node = element.selectedElements[i];
selArray.push(node.getAttribute("id"));
}
}
}
return selArray;
},
onContextMenu: function(element, event) {
element = $(element);
if (document.currentPopupMenu)
hideMenu(document.currentPopupMenu);
var popup = element.sogoContextMenu;
var menuTop = Event.pointerY(event);
var menuLeft = Event.pointerX(event);
var heightDiff = (window.height()
- (menuTop + popup.offsetHeight));
if (heightDiff < 0)
menuTop += heightDiff;
var leftDiff = (window.width()
- (menuLeft + popup.offsetWidth));
if (leftDiff < 0)
menuLeft -= popup.offsetWidth;
var isVisible = true;
if (popup.prepareVisibility)
isVisible = popup.prepareVisibility();
Event.stop(event);
if (isVisible) {
popup.setStyle( { top: menuTop + "px",
left: menuLeft + "px",
visibility: "visible" } );
document.currentPopupMenu = popup;
$(document.body).on("mousedown", onBodyClickMenuHandler);
}
else
log ("Warning: not showing the contextual menu " + element.id);
},
attachMenu: function(element, menuName) {
element = $(element);
element.sogoContextMenu = $(menuName);
element.on("contextmenu", element.onContextMenu);
},
selectElement: function(element) {
element = $(element);
element.addClassName('_selected');
var parent = element.up();
if (!parent.selectedElements || !parent.selectedIds) {
// Selected nodes are kept in a array at the
// container level.
parent.selectedElements = new Array();
parent.selectedIds = new Array();
}
for (var i = 0; i < parent.selectedElements.length; i++)
if (parent.selectedElements[i] == element) return;
parent.selectedElements.push(element); // use index instead ?
if (element.id) {
for (var i = 0; i < parent.selectedIds.length; i++)
if (parent.selectedIds[i] == element.id) return;
parent.selectedIds.push(element.id);
}
},
selectRange: function(element, startIndex, endIndex) {
element = $(element);
var s;
var e;
var rows;
if (startIndex > endIndex) {
s = endIndex;
e = startIndex;
}
else {
s = startIndex;
e = endIndex;
}
if (element.tagName == 'UL')
rows = element.getElementsByTagName('LI');
else
rows = element.getElementsByTagName('TR');
while (s <= e) {
if (rows[s].nodeType == 1)
$(rows[s]).selectElement();
s++;
}
},
selectAll: function(element) {
element = $(element);
if (element.tagName == 'UL')
rows = element.getElementsByTagName('LI');
else
rows = element.select('TBODY TR');
for (var i = 0; i < rows.length; i++) {
if (rows[i].nodeType == 1)
$(rows[i]).selectElement();
}
},
deselect: function(element) {
element = $(element);
element.removeClassName('_selected');
var parent = element.parentNode;
if (parent) {
if (parent.selectedElements)
parent.selectedElements = parent.selectedElements.without(element);
if (parent.selectedIds)
parent.selectedIds = parent.selectedIds.without(element.id);
}
},
deselectAll: function(element) {
if (element.tagName == 'TABLE') {
var tbody = element.tBodies[0];
if (tbody)
element = tbody;
}
element = $(element);
var s = element.select("._selected");
for (var i = 0; i < s.length; i++)
s[i].removeClassName("_selected");
element.selectedElements = null;
element.selectedIds = null;
},
refreshSelectionByIds: function(element, selectedIds) {
element = $(element);
var selectedCount = 0;
if (selectedIds)
element.selectedIds = selectedIds;
if (element.selectedIds) {
for (var i = 0; i < element.selectedIds.length; i++) {
//var e = element.down('#'+element.selectedIds[i]); // buggy with IE
var e = $(element.selectedIds[i]);
if (e) {
if (!e.hasClassName('_selected'))
e.addClassName('_selected');
selectedCount++;
}
else {
log ("refreshSelectionByIds Error: " + element.tagName
+ " select by ID " + element.selectedIds[i]
+ " not found (" + element.childNodes.length + " children)");
}
}
}
return selectedCount;
},
setCaretTo: function(element, pos) {
element = $(element);
if (element.setSelectionRange) { // For Mozilla and Safari
element.focus();
element.setSelectionRange(pos, pos);
}
else if (element.createTextRange) { // For IE
var range = element.createTextRange();
range.move("character", pos);
range.select();
}
},
selectText: function(element, start, end) {
element = $(element);
if (element.setSelectionRange) { // For Mozilla and Safari
element.setSelectionRange(start, end);
}
else if (element.createTextRange) { // For IE
var textRange = element.createTextRange();
textRange.moveStart("character", start);
textRange.moveEnd("character", end-element.value.length);
textRange.select();
}
else {
element.select();
}
},
getRadioValue: function(element, radioName) {
element = $(element);
var radioValue;
Form.getInputs(element, 'radio', radioName).each(function(input) {
if (input.checked)
radioValue = input.value;
});
return radioValue;
},
setRadioValue: function(element, radioName, value) {
element = $(element);
var i = 0;
Form.getInputs(element, 'radio', radioName).each(function(input) {
if (i == value)
input.checked = 1;
i++;
});
},
getCheckBoxListValues: function(element, checkboxName) {
element = $(element);
var values = new Array();
var i = 0;
Form.getInputs(element, 'checkbox', checkboxName).each(function(input) {
if (input.checked)
values.push(i+1);
i++;
});
return values.join(",");
},
setCheckBoxListValues: function(element, checkboxName, values) {
element = $(element);
var v = values.split(',');
var i = 1;
Form.getInputs(element, 'checkbox', checkboxName).each(function(input) {
if ($(v).indexOf(i+"") != -1)
input.checked = 1;
i++;
});
}
});