var common = {
	
	cachedElements: {},
	ajaxTransport: null,
	
	element: function(id) {
		if (typeof common.cachedElements[id] !== 'undefined') {
			return common.cachedElements[id];
		}
		var element = document.getElementById(id);
		if (element === null) return false;
		common.cachedElements[id] = element;
		return element;
	},
	
	_getSibling: function(sign, obj) {
		var tag = arguments[2] != undefined && arguments[2] != false ? arguments[2] : false;
		var childs = obj.parentNode.childNodes;
		var i = sign === '+' ? 0 : childs.length-1;
		var result = [], child = childs[i];
		
		while ((child = childs[i]) != undefined && child != obj) {
			if (child.nodeType === 1) {
				if (tag && child.nodeName.toLowerCase() === tag.toLowerCase()) {
					result.push(child);
				} else if (!tag) {
					result.push(child);
				}
			}
			if (sign === '+') i++; else i--;
		}
		return result;
	},
	
	precedingSibling: function(obj) {
		return common._getSibling('+', obj, arguments[1]);
	},
	
	followingSibling: function(obj) {
		return common._getSibling('-', obj, arguments[1]);
	},
	
	ancestors: function(obj, tag) {
		var parent = obj.parentNode;
		var as_array = arguments[2] != undefined && arguments[2] === true ? false : true;
		var result = as_array ? [] : null;
		while (parent.nodeName.toLowerCase() !== 'html') {
			if (parent.nodeName.toLowerCase() === tag.toLowerCase()) {
				if (!as_array) {
					return parent;
				}
				result.push(parent);
			}
			parent = parent.parentNode;
		}
		return result;
	}
}
