//<![CDATA[

// MISC
function el(ID) {
	return document.getElementById(ID);
}

function px(n) {
	return n + "px";
}

function forceInt(n) {
	return parseInt(n) || 0;
}

function isIE() {
	return (window.navigator.userAgent.indexOf("MSIE") > -1);
}

function fn(obj, meth) {
//	return obj[meth];
	return function(){obj[meth](arguments[0])};
}

function cleanValue(val) {
	var v = "";
	if(val != undefined && val != null)
		v = val;
	return v;
}

// XML
function xmlText(n) {
	var t;

	if(isIE())
		t = n.xml;
	else {
		try {
			t = new XMLSerializer().serializeToString(n);
		} catch(e) {
			try {
				var d = document.createElement("div");
				d.appendChild(n);
				t = d.innerHTML;
				delete d;
			} catch(e){};
		};
	}

	return t;
}

function xmlValue(n) {
	var t = "";
	var i;

	if(isIE()) {
		try {
			t = n.text;
		} catch(e) {};
	}
	else {
		try {
			t = n.firstChild.nodeValue;
		} catch(e) {};
	}

	return t;
}

// EVENTS / ELEMENT POSITIONING
function getEventObject(evt) {
	var e = (evt) ? evt : ((window.event) ? window.event : false);
	var w = window, d = document, b = d.body, de = d.documentElement || {};
	var xmouse, ymouse;
	var ie = isIE();

	if(ie) {
		try {
			e.target = e.srcElement;
			e.pageX = e.clientX + document.body.scrollLeft;
			e.pageY = e.clientY + document.body.scrollTop;
			e.relatedTarget = e.fromElement;
			e.currentTarget = e.toElement;
			e.preventDefault = function() {e.returnValue = false};
			e.stopPropagation = function() {e.cancelBubble = true};
		} catch(E){return undefined};
	}

	xmouse = e.clientX + forceInt(de.scrollLeft) + b.scrollLeft + forceInt(w.scrollX);
	ymouse = e.clientY + forceInt(de.scrollTop) + b.scrollTop + forceInt(w.scrollY);
	e.mouse = {x:xmouse, y:ymouse};

	return e;
}

function getElementPosition(elem) {
	var l, t, w, h, ct, cl, cw, ch, pt, pl, pst, psl, p;
	var op, ops, oc;

	l = elem.offsetLeft;
	t = elem.offsetTop;
	w = elem.offsetWidth;
	h = elem.offsetHeight;

	cl = forceInt(elem.clientLeft);
	ct = forceInt(elem.clientTop);
	cw = elem.clientWidth;
	ch = elem.clientHeight;

	psl = pst = 0;

	p = elem.offsetParent;

	try {
		pl = p.offsetLeft;
		pt = p.offsetTop;

		while(p) {
			psl += p.offsetLeft;
			pst += p.offsetTop;
			p = p.offsetParent;
		}

		l += psl;
		t += pst;
	} catch(e) {};

	op = {top:pt, left: pl};
	ops = {top:pst, left:psl};
	oc = {top:ct, left: cl, width:cw, height:ch};

	return {top:t, left:l, right:l+w, bottom:t+h, width:w, height:h, parent:op, parents:ops, client:oc};
}

function setElementPosition(elem, l, t, c) {
	var absPos, relLeft, relTop;

	absPos = getElementPosition(elem);
	relLeft = l - absPos.left;
	relTop = t - absPos.top;

/*
	try {
		elem.style.left = px(forceInt(getStyle(elem, "left")) + relLeft);
		elem.style.top = px(forceInt(getStyle(elem, "top")) + relTop);
	} catch(e) {};
*/
	setPosition(forceInt(getStyle(elem, "left")) + relLeft, forceInt(getStyle(elem, "top")) + relTop);

	if(isIE() && (forceInt(elem.style.left) != l || forceInt(elem.style.top) != t) && !c)
		setElementPosition(elem, l, t, true);
}

function setPosition(elem, l, t) {
	try {
		elem.style.left = px(l);
		elem.style.top = px(t);
	} catch(e) {};
}

function setElementSize(elem, w, h) {
	elem.style.width = px(w);
	elem.style.height = px(h);
}

function contains(e, c) {
	var pe = getElementPosition(e);
	var pc = getElementPosition(c);

	return contains_p(pe, pc);
}

function contains_p(pe, pc) {
	return (pe.left >= pc.left && pe.right <= pc.right && pe.top >= pc.top && pe.bottom <= pc.bottom);
}

function addListener(elem, evName, fn, capt) {
	if(elem.addEventListener)
		elem.addEventListener(evName, fn, capt);
	else if(elem.attachEvent)
		elem.attachEvent("on" + evName, fn);
}

function removeListener(elem, evName, fn) {
	if(elem.removeEventListener)
		elem.removeEventListener(evName, fn);
	else if(elem.detachEvent)
		elem.detachEvent(evName, fn);
}

// CSS
function addCls(elem, cls) {
	var oldCls = elem.className;
	if(oldCls.indexOf(cls) > -1)
		return;
	var cls = (oldCls) ? oldCls + " " + cls : cls;
	elem.className = cls;
}
function removeCls(elem, cls) {
	var oldCls = elem.className;
	if(oldCls.indexOf(cls) == -1)
		return;
	var re = new RegExp("\\s*" + cls + "\\s*");
	newCls = oldCls.replace(re, "");
	elem.className = newCls;
}
function replaceCls(elem, oldCls, newCls, force) {
	var _cls = elem.className;
	if(_cls.indexOf(oldCls) == -1) {
		if(force)
			addCls(elem, newCls);
		return;
	}
	newCls = _cls.replace(oldCls, newCls);
	elem.className = newCls;
}

function setCSSOpacity(elem, opac) {
	if(typeof(elem.style.filter)=='string'){elem.style.filter='alpha(opacity:'+(opac * 100)+')';}
	if(typeof(elem.style.KHTMLOpacity)=='string'){elem.style.KHTMLOpacity=opac;}
	if(typeof(elem.style.MozOpacity)=='string'){elem.style.MozOpacity=opac;}
	if(typeof(elem.style.opacity)=='string'){elem.style.opacity=opac;}
}

function getStyle(elem, prop) {
	var css;
	if(elem.currentStyle)
		css = elem.currentStyle[prop];
	else if (window.getComputedStyle)
		css = document.defaultView.getComputedStyle(elem, null).getPropertyValue(prop);

	return css;
}

//]]>
