/**
 * class for element attributes ( set / get )
 */
if(typeof Element == 'undefined') {
	var Element = new function () {
		this.count = 0;
		/**
		 * @param	object	element object
		 * @return	integer	element distance from browser top, number in pixels
		 */
		this.getTop = function(obj){
			var myTarget = obj;  
			var top=0;
			if (myTarget.offsetParent) {
				while(myTarget != document.body && myTarget.offsetParent) {
					top += myTarget.offsetTop;
					myTarget = myTarget.offsetParent;
				}
			} else {
				top = myTarget.x;
			}
			return top;
		};

		/**
		 * @param	object	element object
		 * @return	integer	element distance from browser left, number in pixels
		 */
		this.getLeft = function(obj){
			var myTarget = obj;
			var left=0;
			while(myTarget!= document.body && myTarget.offsetParent) {
				left += myTarget.offsetLeft;     
				myTarget = myTarget.offsetParent; 
			}
			return left;
		};

		/**
		 * @param	object	element object
		 * @return	integer	element height, number in pixels
		 */
		this.getHeight = function (obj) {
			return obj.offsetHeight;
		};

		/**
		 * @param	object	element object
		 * @return	integer	element width, number in pixels
		 */
		this.getWidth = function (obj) {
			return obj.offsetWidth;
		};

		/**
		 * Set new coordinates to element
		 *		we expects that elemet_obj.style.position == absolute
		 * @param	object	element_obj	element object
		 * @param	integer	x			element distance from left, number in pixels
		 * @param	integer	y			element distance from top, number in pixels
		 * @param	boolean	win_check	if true, then this div can't move out of browser screen area
		 */
		this.setCoords = function (element_obj,x,y,win_check) {
			if (win_check == true) {
				// checks
				if (x < 0) x = 0; // limit in left
				if (y < 0) y = 0; // limit in top
				var max_x = document.body.clientWidth - this.getWidth(element_obj);
				var max_y = document.body.clientHeight - this.getHeight(element_obj);
			
				window.status = document.body.clientWidth+'/'+document.body.clientHeight+' max'+max_x+'/'+max_y;
				
				// if window scrolled...
				/*
				if (document.body.scrollLeft > 0 && !window.opera)
					max_x += document.body.scrollLeft;
				if (document.body.scrollTop > 0 && !window.opera)
					max_y += document.body.scrollTop;
				*/
				var scrolled = Events.getPageScroll();

				if (scrolled[0] > 0)
					max_x += scrolled[0];
				if (scrolled[1] > 0)
					max_y += scrolled[1];

				if (x > max_x) x = max_x;
				if (y > max_y) y = max_y;
			}
			// change element coords
			element_obj.style.left=parseInt(x) + 'px';
			element_obj.style.top=parseInt(y) + 'px';
		};

		/**
		 * Remove element (and all it's subelements)
		 * @param	object	element_obj	element object
		 */
		this.remove = function (element_obj) {
			if (document.removeNode) { // for ie
				element_obj.removeNode(true);
			} else if (element_obj.parentNode) { 
				element_obj.parentNode.removeChild(element_obj);
			}
		};

		/**
		 * Add another class to element
		 * @param	object	element_obj	element object
		 * @param	string	class_name	string of style class name
		 */
		this.styleClassAdd = function (element_obj,class_name) {
			element_obj.className += ' '+class_name;
		};

		/**
		 * Remove class name from element class
		 * @param	object	element_obj	element object
		 * @param	string	class_name	string of style class name
		 */
		this.styleClassRemove = function (element_obj, class_name) {
			var pattern=new RegExp('\\b ?'+class_name+' ?\\b');
			element_obj.className = element_obj.className.replace(pattern, '');
		};

		/**
		 * Insert node before node
		 * @param	object	node to insert
		 * @param	object	before this node
		 */
		this.insertBefore = function (node, reference_node) {
			reference_node.parentNode.insertBefore(node,reference_node);
		};

		/**
		 * Insert node after node
		 * @param	object	node to insert
		 * @param	object	after this node
		 */
		this.insertAfter = function (node, reference_node) {
			reference_node.parentNode.insertBefore(node, reference_node.nextSibling);
		};

		/**
		 * Change nodes
		 * @param	object	element_obj_1	element object
		 * @param	object	element_obj_2	element object
		 */
		this.swapNode = function (node_1,node_2) {
			if (node_1.swapNode) { // for ie
				node_1.swapNode(node_2);
			} else {
				var nextSibling = node_1.nextSibling;
				if (nextSibling == node_2)
					nextSibling = node_1;
				var parentNode = node_1.parentNode;
				node_2.parentNode.replaceChild(node_1, node_2);
				parentNode.insertBefore(node_2, nextSibling); 
			}
		};

		/**
		 * Get previous node
		 * @param	object	reference node
		 * @return	object	previous node or false, if reference node is first child
		 */
		this.getPreviousNode = function (node) {
			var prev_node = false;
			var buf_node = node;
			while (prev_sibl = buf_node.previousSibling) {
				if (prev_sibl.tagName) {
					prev_node = prev_sibl;
					break;
				}
				buf_node = prev_sibl;
			}
			return prev_node;
		};

		/**
		 * Get next node
		 * @param	object	reference node
		 * @return	object	next node or false, if reference node is last child
		 */
		this.getNextNode = function (node) {
			var next_node = false;
			var buf_node = node;
			while (next_sibl = buf_node.nextSibling) {
				if (next_sibl.tagName) {
					next_node = next_sibl;
					break;
				}
				buf_node = next_sibl;
			}
			return next_node;
		};

	}
}