var Html = {
	os: {},
	render: {},
	getViewport: function () {
		var w = 0;
		var h = 0;
		if (this.render.moz) {
			w = document.documentElement.clientWidth;
			h = window.innerHeight;
		} else {
			if (!this.render.opera && window.innerWidth) {
				w = window.innerWidth;
				h = window.innerHeight;
			} else {
				if (!this.render.opera && document.documentElement.clientWidth) {
					var w2 = document.documentElement.clientWidth;
					if (!w || w2 && w2 < w) {
						w = w2;
					}
					h = document.documentElement.clientHeight;
				} else {
					if (document.body.clientWidth) {
						w = document.body.clientWidth;
						h = document.body.clientHeight;
					}
				}
			}
		}
		return {width: w, height: h};
	},

	getScroll: function () {
		var top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
		var left = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
		return {top: top, left: left, offset: {x: left, y: top}};
	},

	setPositivePixelValue: function (node, selector, value) {
		if (isNaN(value)) {
			return false;
		}
		node.style[selector] = Math.max(0, parseInt(value)) + "px";
		return true;
	},

	setSize: function (node, args) {
		node = typeof node == "string" ? document.getElementById(node) : node;
		var ret = {};
		if (typeof args.width != "undefined") {
			ret.width = this.setPositivePixelValue(node, "width", args.width);
		}
		if (typeof args.height != "undefined") {
			ret.height = this.setPositivePixelValue(node, "height", args.height);
		}
		return ret;
	},

	getSize: function (node) {
		node = typeof node == "string" ? document.getElementById(node) : node;
		return {width: node.offsetWidth, height: node.offsetHeight};
	},

	setPosition: function (node, args) {
		node = typeof node == "string" ? document.getElementById(node) : node;
		var ret = {};
		var sc = this.getScroll();
		if (typeof args.left != "undefined") {
			ret.width = this.setPositivePixelValue(node, "left", args.left+sc.left);
		}
		if (typeof args.top != "undefined") {
			ret.height = this.setPositivePixelValue(node, "top", args.top+sc.top);
		}
		return ret;
	},

	getOpacity: function (node) {
		node = typeof node == "string" ? document.getElementById(node) : node;
		if (this.render.ie) {
			var opac = (node.filters && node.filters.alpha && typeof node.filters.alpha.opacity == "number" ? node.filters.alpha.opacity : 100) / 100;
		} else {
			var opac = node.style.opacity || node.style.MozOpacity || node.style.KhtmlOpacity || 1;
		}
		return opac >= 0.999999 ? 1 : Number(opac);
	},

//	clearOpacity: function (node) {
//		node = typeof node == "string" ? document.getElementById(node) : node;
//		var ns = node.style;
//		if (this.render.ie) {
//			try {
//				if (node.filters && node.filters.alpha) {
//					ns.filter = "";
//				}
//			} catch (e) {}
//		} else {
//			if (this.render.moz) {
//				ns.opacity = 1;
//				ns.MozOpacity = 1;
//			} else {
//				if (this.render.safari) {
//					ns.opacity = 1;
//					ns.KhtmlOpacity = 1;
//				} else {
//					ns.opacity = 1;
//				}
//			}
//		}
//	},
//
//	setOpacity = function (node, opacity, dontFixOpacity) {
	setOpacity: function (node, opacity) {
		node = typeof node == "string" ? document.getElementById(node) : node;
//		if (!dontFixOpacity) {
//			if (opacity >= 1) {
//				if (this.render.ie) {
//					this.clearOpacity(node);
//					return;
//				} else {
//					opacity = 0.999999;
//				}
//			} else if (opacity < 0) {
//				opacity = 0;
//			}
//		}
		if (this.render.ie) {
			if (node.nodeName.toLowerCase() == "tr") {
				var tds = node.getElementsByTagName("td");
				for (var x=0; x < tds.length; x++) {
					tds[x].style.filter = "Alpha(Opacity=" + opacity * 100 + ")";
				}
			}
			node.style.filter = "Alpha(Opacity=" + opacity * 100 + ")";
		} else {
			if (this.render.moz) {
				node.style.opacity = opacity;
				node.style.MozOpacity = opacity;
			} else {
				if (this.render.safari) {
					node.style.opacity = opacity;
					node.style.KhtmlOpacity = opacity;
				} else {
					node.style.opacity = opacity;
				}
			}
		}
	},

	removeChildNodes: function(node) {
		while (node.hasChildNodes()) {
			node.firstChild.parentNode.removeChild(node.firstChild);
		}
	}
};

(function () {
	var dua = navigator.userAgent;
	var dav = navigator.appVersion;
	Html.os.mac = dua.indexOf("Macintosh") >= 0;
	Html.os.win = dua.indexOf("Windows") >= 0;
	Html.os.linux = dua.indexOf("X11") >= 0;
	Html.render.opera = dav.indexOf("Opera") >= 0;
	Html.render.khtml = (dav.indexOf("Konqueror") >= 0) || (dav.indexOf("Safari") >= 0);
	Html.render.safari = dav.indexOf("Safari") >= 0;
	var geckoPos = dua.indexOf("Gecko");
	Html.render.mozilla = Html.render.moz = (geckoPos >= 0) && (!Html.render.khtml);
	if (Html.render.mozilla) {
		Html.render.geckoVersion = dua.substring(geckoPos + 6, geckoPos + 14);
	}
	Html.render.ie = (document.all) && (!Html.render.opera);
	Html.render.ie50 = Html.render.ie && dav.indexOf("MSIE 5.0") >= 0;
	Html.render.ie55 = Html.render.ie && dav.indexOf("MSIE 5.5") >= 0;
	Html.render.ie60 = Html.render.ie && dav.indexOf("MSIE 6.0") >= 0;
	Html.render.ie70 = Html.render.ie && dav.indexOf("MSIE 7.0") >= 0;
})();