/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */
YAHOO.util.Dom = new function ()
{
	this.get = function(el)
	{
		if (typeof el == 'string')
		{
			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)
		{
			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)
		{
			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)
		{
			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)
		{
			box = document.getBoxObjectFor(el);
			pos = [box.x, box.y];
		}
		else
		{
			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')
		{
			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;
		}
		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;
		}
		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;
	this.width = r-l;
	this.height = b-t;
};
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();