var Html = {
	Get : function(id)
	{
		if (typeof(id) == 'string')
			id = document.getElementById(id);
		return id;
	},
	
	NodeFromHtml : function(html, doc)
	{
		var n = (doc || document).createElement("BODY");
		n.innerHTML = html;
		n = n.removeChild(n.firstChild);
		n.normalize();
		return n;
	},	
	
	Browser : {
		
		_SearchUserAgent : function (str)
		{
			return navigator.userAgent.toLowerCase().indexOf(str) >= 0 ? true : false;
		},
		
		IsIE: function() { return this._SearchUserAgent("msie"); },
		IsIE6: function() { return this._SearchUserAgent("msie 6"); },
		IsFirefox: function() { return this._SearchUserAgent("firefox"); }
	},
	
	_ElementOffsetTopCorrection : function (element)
	{
		if (!element || !element.currentStyle) return 0;
		var topborder = parseInt(element.currentStyle.borderTopWidth);
		return isNaN(topborder)? 0: topborder;
	},
	
	ElementOffset : function (element)
	{
		if (element.tagName == 'BODY')
			return {	Left:0, 
						Top:0, 
						Width:document.body.offsetWidth, 
						Height:document.body.offsetHeight 
					};

		var top = 0;
		var left = 0;
		var width = element.offsetWidth;
		var height = element.offsetHeight;
		
		while (element.offsetParent)
		{
			top += element.offsetTop;
			left += element.offsetLeft;
		
			element = element.offsetParent;
			top += this._ElementOffsetTopCorrection(element);
		}
		return { Left:left, Top:top, Width:width, Height:height };	
	},	
	
	Window : {
		Width : function()
		{
			if (self.innerWidth)
				return self.innerWidth;
			else if (document.documentElement && document.documentElement.clientWidth)
				return document.documentElement.clientWidth;
			else if (document.body)
				return document.body.clientWidth;
			else
				return 0;
		},
		
		Height : function()
		{
			if (self.innerWidth)
				return self.innerHeight;
			else if (document.documentElement && document.documentElement.clientWidth)
				return document.documentElement.clientHeight;
			else if (document.body)
				return document.body.clientHeight;
			else
				return 0;
		}
	}
};

var Class = {
		Has : function(node, classname)
		{
			return (new RegExp('(^|\\s)'+classname+'(\\s|$)','gi')).test(Class.Get(node));
		},
		
		Add : function(element, classname)
		{
			if (!Class.Has(element, classname)) 
			{
				var oldclass = Class.Get(element);
				Class.Set(element, (oldclass? oldclass + ' ': '') + classname);
			}
		},
		
		Remove : function(element, classname)
		{
			var newcs = Class.Get(element).replace(new RegExp('(\\s*' + classname +'$)|(' + classname +'\\s*)', 'gi'),'');
			Class.Set(element, newcs);
		},
		
		Get : function(element)
		{
			element = Html.Get(element);
			return element.className;
		},
		
		Set : function(element, classname)
		{
			element = Html.Get(element);
			element.className = classname;
		}
}