YAHOO.util.Dom = new function() {
this.get = function(el) {
if (typeof el == 'string') { // accept object or id
el = document.getElementById(el);
}
return el;
};
this.getStyle = function(el, property) {
var value = null;
var dv = document.defaultView;
el = this.get(el);
if (property == 'opacity' && el.filters) {// IE opacity
value = 1;
try {
value = el.filters.item('DXImageTransform.Microsoft.Alpha').opacity / 100;
} catch(e) {
try {
value = el.filters.item('alpha').opacity / 100;
} catch(e) {}
}
}
else if (el.style[property]) {
value = el.style[property];
}
else if (el.currentStyle && el.currentStyle[property]) {
value = el.currentStyle[property];
}
else if ( dv && dv.getComputedStyle )
{  // convert camelCase to hyphen-case
var converted = '';
for(i = 0, len = property.length;i < len; ++i) {
if (property.charAt(i) == property.charAt(i).toUpperCase()) {
converted = converted + '-' + property.charAt(i).toLowerCase();
} else {
converted = converted + property.charAt(i);
}
}
if (dv.getComputedStyle(el, '').getPropertyValue(converted)) {
value = dv.getComputedStyle(el, '').getPropertyValue(converted);
}
}
return value;
};
this.setStyle = function(el, property, val) {
el = this.get(el);
switch(property) {
case 'opacity' :
if (el.filters) {
el.style.filter = 'alpha(opacity=' + val * 100 + ')';
if (!el.currentStyle.hasLayout) {
el.style.zoom = 1;
}
} else {
el.style.opacity = val;
el.style['-moz-opacity'] = val;
el.style['-khtml-opacity'] = val;
}
break;
default :
el.style[property] = val;
}
};
this.getXY = function(el) {
el = this.get(el);
if (el.parentNode === null || this.getStyle(el, 'display') == 'none') {
return false;
}
var parent = null;
var pos = [];
var box;
if (el.getBoundingClientRect) { // IE
box = el.getBoundingClientRect();
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
return [box.left + scrollLeft, box.top + scrollTop];
}
else if (document.getBoxObjectFor) { // gecko
box = document.getBoxObjectFor(el);
pos = [box.x, box.y];
}
else { // safari/opera
pos = [el.offsetLeft, el.offsetTop];
parent = el.offsetParent;
if (parent != el) {
while (parent) {
pos[0] += parent.offsetLeft;
pos[1] += parent.offsetTop;
parent = parent.offsetParent;
}
}
var ua = navigator.userAgent.toLowerCase();
if (
ua.indexOf('opera') != -1
|| ( ua.indexOf('safari') != -1 && this.getStyle(el, 'position') == 'absolute' )
) {
pos[1] -= document.body.offsetTop;
}
}
if (el.parentNode) { parent = el.parentNode; }
else { parent = null; }
while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') {
if (parent.tagName != "TR")
{
pos[0] -= parent.scrollLeft;
pos[1] -= parent.scrollTop;
}
if (parent.parentNode) { parent = parent.parentNode; }
else { parent = null; }
}
return pos;
};
this.getX = function(el) {
return this.getXY(el)[0];
};
this.getY = function(el) {
return this.getXY(el)[1];
};
this.setXY = function(el, pos, noRetry) {
el = this.get(el);
var pageXY = YAHOO.util.Dom.getXY(el);
if (pageXY === false) { return false; } // has to be part of doc to have pageXY
if (this.getStyle(el, 'position') == 'static') { // default to relative
this.setStyle(el, 'position', 'relative');
}
var delta = [
parseInt( YAHOO.util.Dom.getStyle(el, 'left'), 10 ),
parseInt( YAHOO.util.Dom.getStyle(el, 'top'), 10 )
];
if ( isNaN(delta[0]) ) { delta[0] = 0; } // defalts to 'auto'
if ( isNaN(delta[1]) ) { delta[1] = 0; }
if (pos[0] !== null) { el.style.left = pos[0] - pageXY[0] + delta[0] + 'px'; }
if (pos[1] !== null) { el.style.top = pos[1] - pageXY[1] + delta[1] + 'px'; }
var newXY = this.getXY(el);
if (!noRetry && (newXY[0] != pos[0] || newXY[1] != pos[1]) ) {
this.setXY(el, pos, true);
}
return true;
};
this.setX = function(el, x) {
return this.setXY(el, [x, null]);
};
this.setY = function(el, y) {
return this.setXY(el, [null, y]);
};
this.getRegion = function(el) {
el = this.get(el);
return new YAHOO.util.Region.getRegion(el);
};
this.getClientWidth = function() {
return (
document.documentElement.offsetWidth
|| document.body.offsetWidth
);
};
this.getClientHeight = function() {
return (
self.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight
);
};
};
YAHOO.util.Region = function(t, r, b, l) {
this.top = t;
this.right = r;
this.bottom = b;
this.left = l;
};
YAHOO.util.Region.prototype.contains = function(region) {
return ( region.left   >= this.left   &&
region.right  <= this.right  &&
region.top    >= this.top    &&
region.bottom <= this.bottom    );
};
YAHOO.util.Region.prototype.getArea = function() {
return ( (this.bottom - this.top) * (this.right - this.left) );
};
YAHOO.util.Region.prototype.intersect = function(region) {
var t = Math.max( this.top,    region.top    );
var r = Math.min( this.right,  region.right  );
var b = Math.min( this.bottom, region.bottom );
var l = Math.max( this.left,   region.left   );
if (b >= t && r >= l) {
return new YAHOO.util.Region(t, r, b, l);
} else {
return null;
}
};
YAHOO.util.Region.prototype.union = function(region) {
var t = Math.min( this.top,    region.top    );
var r = Math.max( this.right,  region.right  );
var b = Math.max( this.bottom, region.bottom );
var l = Math.min( this.left,   region.left   );
return new YAHOO.util.Region(t, r, b, l);
};
YAHOO.util.Region.prototype.toString = function() {
return ( "Region {" +
"  t: "    + this.top    +
", r: "    + this.right  +
", b: "    + this.bottom +
", l: "    + this.left   +
"}" );
}
YAHOO.util.Region.getRegion = function(el) {
var p = YAHOO.util.Dom.getXY(el);
var t = p[1];
var r = p[0] + el.offsetWidth;
var b = p[1] + el.offsetHeight;
var l = p[0];
return new YAHOO.util.Region(t, r, b, l);
};
YAHOO.util.Point = function(x, y) {
this.x      = x;
this.y      = y;
this.top    = y;
this.right  = x;
this.bottom = y;
this.left   = x;
};
YAHOO.util.Point.prototype = new YAHOO.util.Region();
