/**
 * @author Kenneth.priisholm
 */
var VEvent = VEvent || {};
/*
var $D = function(id){
	return document.getElementById(id);
}
*/
var DOMUtils = {
	oTargetLimit : document.body,
	sTarget : "a",
	targetFilter : function(oTarget){
		return (oTarget.nodeName.toLowerCase() != DOMUtils.sTarget.toLowerCase())
	},
	addEvent : function(oElement, evType, oFunc, bUseCapture){
		//credit: Scott Andrews
		
		if(oElement.addEventListener){
			oElement.addEventListener(evType, oFunc, bUseCapture);
			return true;
		}
		else if(oElement.attachEvent){
			var ret = oElement.attachEvent("on" + evType, oFunc);
			return ret;
		}
		else {
			oElement["on" + evType] = oFunc;
			return true;
		}
	},
	findElement : function(oElement, oFunc){
		if(oFunc(oElement)) return oElement;
		for(var i = 0; i < oElement.childNodes.length; i++){
			oTmp = DOMUtils.findElement(oElement.childNodes[i], oFunc);
			if(oTmp != null) return oTmp;
		}
		return null;
	},
	findElements : function(oElement, oFunc, aReturn){
		if(oFunc(oElement)) aReturn.push(oElement);
		for(var i = 0; i < oElement.childNodes.length; i++){
			aReturn = DOMUtils.findElements(oElement.childNodes[i], oFunc, aReturn);
		}
		return aReturn;
	},
	findTarget : function(e){
		var target = arguments[0];
		if(window.event && window.event.srcElement)
			target = window.event.srcElement;
		else if(e && e.target)
			target = e.target;
		if(!target)
			return null;
		while(target != DOMUtils.oTargetLimit && DOMUtils.targetFilter(target)){
			target = target.parentNode;
		}
		if(DOMUtils.targetFilter(target)) return null;
		return target;
	}
}

VEvent.addListener = function () {
    if ( window.addEventListener ) {
        return function (el, type, fn, scope) {
            var f = function (e) {
                fn.call(el, e, scope);
            };
            el.addEventListener(type, f, false);
        };
    } else if ( window.attachEvent ) {
        return function (el, type, fn, scope) {
            var f = function () {
                fn.call(el, window.event, scope);
            };
            el.attachEvent('on' + type, f);
        };
    } else {
        return function (el, type, fn) {
            el['on' + type] = fn;
        };
    }
}();
