/*	
	autor			: this be tofus - maxomedia ag
	module			: mxm.dom
	dependencies	: mxm.base
*/


/* ---------------------------------------------------------------------------------------------------- */
/* =mxm.dom */
/* ---------------------------------------------------------------------------------------------------- */

/* constructor */
function mxmdom() {
	this._document = document;
	this._window = window;
	this.module = "dom";
}

/* initialize */
mxmjskit.prototype.dom = new mxmdom();




/* ---------------------------------------------------------------------------------------------------- */
/* =methods */
/* ---------------------------------------------------------------------------------------------------- */

/* =getElement(id) */
mxmdom.prototype.getElement = function (id) {
	return ((typeof(id) == "string") ? mxm.dom._document.getElementById(id) : id);
};


/* =getElementsByTagAndClassName({ tagName | null }, className [, parent]) */
mxmdom.prototype.getElementsByTagAndClassName = function (tagName, className, parent) {
	
	if (typeof(tagName) == 'undefined' || tagName == null) tagName = '*';
	if (typeof(parent) == 'undefined' || parent == null) parent = mxm.dom._document;
	parent = mxm.dom.getElement(parent);
	
	var children = parent.getElementsByTagName(tagName) || mxm.dom._document.all;
	var elements = [];
	for (var i = 0; i < children.length; i++) {
	    var child = children[i];
	    var classNames = child.className.split(' ');
	    for (var j = 0; j < classNames.length; j++) {
	        if (classNames[j] == className) {
	            elements.push(child);
	            break;
	        }
	    }
	}
	
	return elements;
};


/* =addElementClass({ element | Array }, className)	*/
mxmdom.prototype.addElementClass = function (element, className) {
	
	if (mxm.base.isArrayLike(element)) { // if isArrayLike(element) loop function
		for (j = 0; j < element.length; j++) mxm.dom.addElementClass(element[j], className);
		return;
	}
	
	element = mxm.dom.getElement(element); // get element
	
	var blnAttached = false; 
	var classNames = [];
	if (typeof(element.className) != 'undefined') { // check if class is attached
		classNames = element.className.split(' '); // build classNames
		for (var i = 0; i < classNames.length; i++) { 
			if (classNames[i] == className) {
				blnAttached = true;
				break;
			}
		}
	}
	
	if (!blnAttached) classNames.push(className); // extend array
	element.className = classNames.join(' '); // set className
};


/* =removeElementClass({ element | Array }, className) */
mxmdom.prototype.removeElementClass = function (element, className) {
	
	if (mxm.base.isArrayLike(element)) { // loop function if @element is array
		for (j = 0; j < element.length; j++) mxm.dom.removeElementClass(element[j], className);
		return;
	}
		
	element = mxm.dom.getElement(element); // get element
	var classNames = element.className.split(' '); // build classNames
	
	for (var i = 0; i < classNames.length; i++) {
		if (classNames[i] == className) {
			classNames.splice(i,1);
			break;
		}
	}
	
	element.className = classNames.join(' '); // set className
	
};


/* =getPreviousElementNode(element) */
mxmdom.prototype.getPreviousElementNode = function (element) {
	element = mxm.dom.getElement(element); // get element
	var node = element.previousSibling;
	if (node != null) { // check if is node
		while (node.nodeType != 1) {
			if (node == element.parentNode.firstChild) {
				node = null;
				break;
			}
			node = node.previousSibling;
		}
	}
	return node;
}

/* =getNextElementNode(element) */
mxmdom.prototype.getNextElementNode = function (element) {
	element = mxm.dom.getElement(element); // get element
	var node = element.nextSibling;
	if (node != null) { // check if is node
		while (node.nodeType != 1) {
			if (node == element.parentNode.lastChild) {
				node = null;
				break;
			}
			node = node.nextSibling;
		}
	}
	return node;
}


/* =getPosition(element) */
mxmdom.prototype.getPosition = function (element) {
	var posX, posY;
	element = mxm.dom.getElement(element); // get element
	posX = 0, obj = element; // x
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			posX += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	}
	posY = 0, obj = element; // y
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			posY += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	return { x: posX, y: posY };
}

/* =getMousePosition() */
mxmdom.prototype.getMousePosition = function (e) {
	var posX, posY;
	if (e.pageX || e.pageY) {
		posX = e.pageX;
		posY = e.pageY;
	} else if (e.clientX || e.clientY) {
		posX = e.clientX + document.documentElement.scrollLeft;
		posY = e.clientY + document.documentElement.scrollTop;
	}
	return { x: posX, y: posY };
}

/* = stopPropagation() */
mxmdom.prototype.stopPropagation = function (e) {
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}