function oFindParentById(node, id) {
	if (!node || !id) return null;
	if (node.id == id) return node;
	if (node.tagName == 'BODY') return null;
	return oFindParentById(node.parentNode, id);
}

function oFindParentByTagName(node, tag) {
	if (!node || !tag) return null;
	if (node.tagName == tag) return node;
	if (node.tagName == 'BODY') return null;
	return oFindParentByTagName(node.parentNode, tag);
}

function oFindChild(node, tag, id) {
	var childs=oFindChildByTagNames(node, tag);
	if (childs) {
		for (var i=0; i < childs.length; i++) {
			if (childs[i].id == id) return childs[i];
		}
	}
	return null;
}

function oFindChildren(node, tag, id) {
	var childs=oFindChildByTagNames(node, tag);
	var ret=[];
	if (childs) {
		for (var i=0; i < childs.length; i++) {
			if (childs[i].id == id) ret.push(childs[i]);
		}
	}
	return ret;
}

function oFindChildByTagName(node, tag) {
	if (!node) return null;
	if (node.tagName == tag) return node;
	var nodes=node.getElementsByTagName(tag);
	if (nodes) return nodes[0];
	else return null;
}

function oFindChildByTagNames() {
	if (arguments.length < 2) return [];
	var parentNode=arguments[0];
	var ret=[];
	for (var i=1; i < arguments.length; i++) {
		var nodes=parentNode.getElementsByTagName(arguments[i]);
		for (var p=0; p < nodes.length; p++)
			ret.push(nodes[p]);
	}
	return ret;
}

function oFindChildTextNode(node) {
	if (!node) return null;
	for (var i=0; i < node.childNodes.length; i++) {
		if (node.childNodes[i].nodeType == 3)
			return node.childNodes[i];
	}
	return null;
}

function oChildByTag(node, tag) {
	if (!node || !tag || !node.hasChildNodes()) return null;
	for (var i=0; i < node.childNodes.length; i++) {
		if (node.childNodes[i].tagName == tag) return node.childNodes[i];
	}
	return null;
}

function oFindPrevSiblingByTag(node, tag) {
	if (!node || !tag || !node.previousSibling) return node;
	for (var brother=node; brother; brother=brother.previousSibling) {
		if (brother.tagName == tag) return brother;
	}
	return null;
}

function oFindNextSiblingByTag(node, tag) {
	if (!node || !tag || !node.nextSibling) return node;
	for (var brother=node; brother; brother=brother.nextSibling) {
		if (brother.tagName == tag) return brother;
	}
	return null;
}
