Ext.define('Ext.overrides.dom.Element', {
override: 'Ext.dom.Element',
_positionTopLeft: ['position', 'top', 'left'],
measure: function (dimension) {
var me = this,
dom = me.dom,
includeWidth = dimension !== 'h',
height, rect, width;
if (dom.nodeName === 'BODY') {
height = dimension !== 'w' && Element.getViewportHeight();
width = includeWidth && Element.getViewportWidth();
rect = dimension ? null : { width: width, height: height };
}
else {
rect = dom.getBoundingClientRect();
height = rect.height;
width = rect.width;
}
return dimension ? (includeWidth ? width : height) : rect;
},
setX: function(x, animate) {
return this.setXY([x, this.getY()], animate);
},
setXY: function(xy, animate) {
var me = this;
if (!animate) {
me.callParent([xy]);
} else {
if (!Ext.isObject(animate)) {
animate = {};
}
me.animate(Ext.applyIf({ to: { x: xy[0], y: xy[1] } }, animate));
}
return this;
},
setY: function(y, animate) {
return this.setXY([this.getX(), y], animate);
},
translateXY: function(x, y) {
var me = this,
el = me.el,
styles = el.getStyle(me._positionTopLeft),
relative = styles.position === 'relative',
left = parseFloat(styles.left),
top = parseFloat(styles.top),
xy = me.getXY();
if (Ext.isArray(x)) {
y = x[1];
x = x[0];
}
if (isNaN(left)) {
left = relative ? 0 : el.dom.offsetLeft;
}
if (isNaN(top)) {
top = relative ? 0 : el.dom.offsetTop;
}
left = (typeof x === 'number') ? x - xy[0] + left : undefined;
top = (typeof y === 'number') ? y - xy[1] + top : undefined;
return {
x: left,
y: top
};
},
visit: function (options) {
var me = this,
dom = me.dom,
skipSelf = options.skipSelf,
excludeRoot = options.excludeRoot,
callback = options.callback || options.fn,
scope = options.scope || this,
reverse = options.reverse,
selector = options.selector,
whatToShow = options.include || NodeFilter.SHOW_ELEMENT,
treeWalker = document.createTreeWalker(dom, whatToShow, null, false),
result = null,
node = dom;
if (reverse) {
for (node = dom.lastElementChild; node.lastElementChild; node = node.lastElementChild);
treeWalker.currentNode = node;
}
for (; result !== false && node; node = reverse ? treeWalker.previousNode() : treeWalker.nextNode()) {
if (!(excludeRoot && excludeRoot.contains(node))) {
if (!(node === dom && skipSelf)) {
if (!(selector && !node[Ext.supports.matchesSelector](selector))) {
result = Ext.callback(callback, scope, [node]);
}
}
}
}
return result;
}
});