/*
Michael Buerge (buerge@nextage.ch)

DOM utitlity functions
*/


dom = {};

dom.getElementById = function() {
	if (ua.ie) return function(id) { return document.all[id]; };
	else return function(id) {return document.getElementById(id); };
} ();


dom.createElement = function(tagName, properties) {
	var elm = document.createElement(tagName);
	
	if (ua.ie) {
		if (!properties) properties = {};
		if (!properties.innerHTML) properties.innerHTML = '';
	}
		
	dom.setProperties(elm, properties);
	
	
	return elm;
};
dom.removeElement = function(elm) {
	if (typeof elm.parentNode == 'object') elm.parentNode.removeChild(elm);
};

dom.nodeContains = function(container, elm) {
	while (elm) {
		if (container == elm) return true;
		else elm = elm.parentNode;
	};
	return false;
};

dom.elmIsOfClass = function(elm, className) {
	if (!elm.className) return false;
	var classes = elm.className.split(' ');
	for (var i = 0; i < classes.length; i++) {
		if (className == classes[i]) return true;
	}
	return false;
}

dom.setProperties = function(elm, properties) {
	if (typeof properties != 'object') return;
	 
	for (var name in properties) {
		var val = properties[name];
		switch (name) {
			case 'css':
				dom.setCSS(elm, val); break;
			case 'id':
				elm.id = val; break;
			case 'pos':
			case 'position':
				elm.style.position = val; break;
			case 'x':
			case 'left':
				elm.style.left = (typeof val == 'number') ? val + 'px' : val; break;
			case 'y':
			case 'top':
				elm.style.top = (typeof val == 'number') ? val + 'px' : val; break;
			case 'coords':
				elm.style.left = val.x + 'px';
				elm.style.top = val.y + 'px';
				break;
			case 'w':
			case 'width':
				elm.style.width = (typeof val == 'number') ? val + 'px' : val; break;
			case 'h':
			case 'height':
				elm.style.height = (typeof val == 'number') ? val + 'px' : val; break;
			case 'z':
				elm.style.zIndex = val; break;
			case 'bgcolor':
			case 'bgColor':
				elm.style.backgroundColor = val; break;
			case 'bgImage':
				elm.style.backgroundImage = 'url(' + val + ')'; break;
			case 'vis':
			case 'visibility':
				elm.style.visibility = (typeof val == 'boolean') ? (val ? 'inherit' : 'hidden' ) : val; break;
			case 'display':
				elm.style.display = (typeof val == 'boolean') ? (val ? '' : 'none') : val; break;
			case 'innerHTML':
				elm.innerHTML = val; break;
			case 'opacity':
				if (ua.ie) elm.style.filter = 'alpha(opacity:' + (val * 100) + ')';
				else {
					if (ua.gecko && val >= 1) val = .9999; // switch from transparent to non-transparent causes flicker
					if (ua.gecko) elm.style.MozOpacity = val;
					else elm.style.opacity = val;
				}
				break;
			default:
				elm.style[name] = val; break;
		};
	}
};
dom.setCSS = function(elm, cssString) {
	elm.style.cssText += ';' + cssString;
};

dom.getX = function(elm) { return elm.offsetLeft; };
dom.getY = function(elm) { return elm.offsetTop; };

dom.getPageX = function(elm) {
	var x = 0;
	while (elm != document.body) {
		x += dom.getX(elm);
		elm = elm.parentNode;
	};
	return x;
}
dom.getPageY = function(elm) {
	var y = 0;
	while (elm != document.body) {
		y += dom.getY(elm);
		elm = elm.parentNode;
	}
	return y;
}

/*
IE-WIN:
document.elm.clientWidth liefert nicht das gewünschte, falls als DOCTYPE XHMTL-transitional angegeben wurde!!!!
*/
dom.getW = function(elm) {
	switch (elm.tagName.toLowerCase()) {
		case 'body': return (ua.gecko || ua.khtml) ? window.innerWidth : elm.clientWidth;
		default: return (ua.ie && ua.win32) ? parseInt(elm.scrollWidth) : elm.offsetWidth;
	}
};
dom.getH = function(elm) {
	switch (elm.tagName.toLowerCase()) {
		case 'body': return (ua.gecko || ua.khtml) ? window.innerHeight : elm.clientHeight;
		default: return (ua.ie && ua.win32) ? parseInt(elm.scrollHeight) : elm.offsetHeight;
	}
};


dom.getContentW = function(elm) {
	if (ua.ie) {
		if (ua.mac) var dummy = elm.offsetWidth;
		return parseInt(elm.scrollWidth);
	}
	else {
		alert('not implemented');
	}
}



//--------------------------------------------------------
// helper-classes
//--------------------------------------------------------

Point = function(arg1, arg2) {
	// copy another point
	if (typeof arg1 == 'object') {
		this.x = arg1.x;
		this.y = arg1.y;
	}
	else {
		this.x = (typeof arg1 == 'number') ? arg1 : 0;
		this.y = (typeof arg2 == 'number') ? arg2 : 0;
	}
}


