

var $e = new function() {
	var _html = undefined;
	var _body = undefined;

	// Tries to make browser to cache backgrounds
	this.cacheBackground = function() {
		try {document.execCommand("BackgroundImageCache", false, true);} catch (e){}
	},

	this.go = function(href) {
		window.location.href = href;
	}

	this.getStyle = function(elem) {
		if (elem.currentStyle) return elem.currentStyle;
		else if (window.getComputedStyle) return window.getComputedStyle(elem, null)
		else return undefined;
	}

	// ***
	// Returnes elem's coordinates on the page
	this.elemSizes = function(elem) {
		_html = _html || document.documentElement;
		_body = _body || document.body;

		var box = elem.getBoundingClientRect();
		//elTest1.value = box;
		//elTest2.value = box.top;

		var width = Math.round(box.right - box.left);
		var height = Math.round(box.bottom - box.top);

		var scrollTop = window.pageYOffset || _html.scrollTop || _body.scrollTop;
		var scrollLeft = window.pageXOffset || _html.scrollLeft || _body.scrollLeft;
		var clientTop = _html.clientTop || _body.clientTop || 0;
		var clientLeft = _html.clientLeft || _body.clientLeft || 0;

		var top = Math.round(box.top + scrollTop - clientTop);
		var left = Math.round(box.left + scrollLeft - clientLeft);

		return {
			top: top, left: left,
			bottom: top + height,	right: left + width,
			width: width, height: height
		}

	},

	// ***
	// Returnes standart event
	this.event = function(e) {
		_html = _html || document.documentElement;
		_body = _body || document.body;

		e = e || window.event;
		var elemTo = e.target || e.srcElement;
		var elemFrom = e.target || e.srcElement;
		if ( e.pageX == null && e.clientX != null ) {
			e.pageX = e.clientX + (_html && _html.scrollLeft || _body && _body.scrollLeft || 0) - (_html.clientLeft || 0);
			e.pageY = e.clientY + (_html && _html.scrollTop || _body && _body.scrollTop || 0) - (_html.clientTop || 0);
		}
		if (!e.which && e.button) {
			e.which = e.button & 1 ? 1 : ( e.button & 2 ? 3 : ( e.button & 4 ? 2 : 0 ) )
		}

		var target = e.target || e.srcElement;
		var related = e.relatedTarget;
		if (!related && e.fromElement) {
		  related = (e.fromElement == target)? e.toElement : e.fromElement;
		}

		return {
			x: e.pageX, y: e.pageY,
			lb: e.which == 1, mb: e.which == 2, rb: e.which == 3,
			target: target, related: related
		};
	},

	// ***
	// Retrieves elem by given class list
	this.elemsByClass = function(classList, node) {
		// standart function?
		if (document.getElementsByClassName) {
			return (node || document).getElementsByClassName(classList)
		}
		// handmade
		else {
			var node = node || document;
			var list = node.getElementsByTagName('*');
			var length = list.length;
			var classArray = classList.split(/\s+/);
			var classes = classArray.length;
			var result = [], i,j;
			for(i = 0; i < length; i++) {
				for(j = 0; j < classes; j++) {
					if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
						result.push(list[i]);
						break;
					}
				}
			}
			return result;
		}
	}

	// ***
	this.elemIsOf = function (elem, elemOf) {
		while (true) {
			if (!elem) return false;
			if (elem === elemOf) return true;
			if (elem === document) return false;
			elem = elem.parentNode;
		}
	}

	this.isIE6 = function() {
		return document.body.style.maxHeight === undefined;
	}

}
